如何将从模板继承的对象传递给函数
请参阅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);
}
答案 0 :(得分:1)
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基类都是唯一类型。出于这个原因,您可能希望从具有虚拟析构函数的共享基类继承,如上例所示。
我认为该限制也适用于通过异构引用将派生类的对象传递给函数。