Как я могу передать объект, унаследованный от шаблона, так как это функция
см. конструктор GameObj :: GameObj, я пытаюсь передать GameObj, наследующий шаблон BaseGameObject, но его недействительно
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);
}
эта ссылка не работает для меня: передача классов шаблонов в качестве аргументов методам
BaseGameObject
- это шаблон. GameObjImageCompnent::update
имеет объявление virtual void update(BaseGameObject& baseGameObject);
, Это неправильно, потому что BaseGameObject
- это не тип, а шаблон.
Возможно, вы должны изменить это объявление на: virtual void update(BaseGameObject<GameObj>& baseGameObject);
Если вам нужно иметь возможность вызывать это с помощью разных BaseGameObject
s, вы можете сделать 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 является уникальным типом. По этой причине, вероятно, вы захотите наследовать из общего базового класса с виртуальным деструктором, как в примере выше.
Я думаю, что это ограничение также относится к передаче объектов производных классов функции через гетерогенную ссылку.
BaseGameObject
- это шаблон. BaseGameObject<T>
является типом. BaseGameObject
не является типом, неполным или иным образом.