我如何将从模板继承的对象传递给函数

请参阅GameObj :: GameObj构造函数
我尝试传递继承了BaseGameObject模板的GameObj
但无效

template<typename T>
class BaseGameObject
{
    public:
        BaseGameObject(){};

        virtual ~BaseGameObject(){};

        static T* create(IImageComponent* imageComponent)
        {

        }
    protected:
        IImageComponent* m_IImageComponent;
};
class GameObj :public BaseGameObject<GameObj>
{
    public:
        GameObj(IImageComponent* imageComponent);
        virtual ~GameObj(){};



};

GameObj::GameObj(IImageComponent* imageComponent):m_IImageComponent(imageComponent)
{

    m_IImageComponent->update(*this); //HERE IS THE PROBLEM IT ASK ME TO PASS TAMPLATE
}
class GameObjImageCompnent
{
public :
    GameObjImageCompnent(const std::string &spritefilename);
    virtual void update(BaseGameObject& baseGameObject);


private:
    std::string m_spritefilename;
};

GameObjImageCompnent::GameObjImageCompnent(const std::string &spritefilename):
    m_spritefilename(spritefilename)
{
    ;
}
void GameObjImageCompnent::update(BaseGameObject& baseGameObject)
{

    baseGameObject.setInitWithSpriteFrameName(m_spritefilename);
}


此链接对我不起作用:
Passing template classes as arguments to methods

最佳答案

BaseGameObject是模板。 GameObjImageCompnent::update具有声明virtual void update(BaseGameObject& baseGameObject);。这是错误的,因为BaseGameObject不是类型而是模板。

也许您应该将该声明更改为:virtual void update(BaseGameObject<GameObj>& baseGameObject);

如果您需要能够使用不同的BaseGameObject进行调用,也可以将GameObjImageCompnent设置为模板:

template<class T>
class GameObjImageCompnent {
// ...
virtual void update(BaseGameObject<T>& baseGameObject);


如果不是这样,则可能需要从非模板基类继承BaseGameObject并将其用作您的引用类型。如果也不选择BaseGameObject的基类,则需要重新考虑设计。

class IGameObject {
public:
    virtual ~IGameObject() {}
    // any other virtual functions that are needed
};

template<typename T>
class BaseGameObject: public IGameObject {
//...

class GameObjImageCompnent {
// ...
virtual void update(IGameObject& baseGameObject);


您似乎正在使用CRTP。请参阅陷阱部分:


  静态多态性的一个问题是,如果不使用上述示例中的通用基类(例如“ Shape”),则不能将派生类异构存储,因为每个CRTP基类都是唯一类型。由于这个原因,您可能想要从带有虚拟析构函数的共享基类继承,就像上面的示例一样。


我认为该限制也适用于通过异构引用将派生类的对象传递给函数。

关于c++ - 我可以传递从模板类继承的对象类吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21908096/

10-09 13:11