我知道这里有很多“无法转换参数”的问题,但我保证我已经环顾四周,而且我认为尚未询问我的特殊情况,而且我已经尝试调试了好几个小时,但可以似乎没有得到。
基本上,我正在为2D游戏引擎创建组件系统。我将逻辑分为两部分:Component
和ComponentSystem
。 Component
类将仅存储数据,而ComponentSystem
将相应地更新和操作该数据。ComponentSystem
基类是抽象的,带有一个模板,用于指定系统将使用哪个Component
。这是.h文件:
// =================================================================================================
// == COMPONENT SYSTEM CLASS =======================================================================
// =================================================================================================
template <class T>
class ComponentSystem
{
public:
// -- ctor & dtor
ComponentSystem<T>();
~ComponentSystem<T>();
// -- update components
virtual void UpdateComponents(float dt) = 0;
// -- populates the components of this systems
virtual void PopulateFromCurrentLevel() = 0;
// -- clears the components of this system
virtual void ClearFromCurrentLevel() = 0;
protected:
// -- actual list of components
std::vector<T*> components;
};
然后,我还有一个
SpriteComponentSystem
,它是从ComponentSystem
派生的,但以SpriteComponent
作为模板类型:class SpriteComponentSystem : public ComponentSystem<SpriteComponent>
{
public:
SpriteComponentSystem();
~SpriteComponentSystem();
virtual void UpdateComponents(float dt);
virtual void PopulateFromCurrentLevel();
virtual void ClearFromCurrentLevel();
};
最后,在我的
Game
类中,我存储了基类的向量,如下所示:std::vector<ComponentSystem<Component*>*> systems;
但是,当我尝试将
SpriteComponentSystem*
推入systems
时,出现以下错误:C2664 - 'void std::vector<HSZGame::ComponentSystem<HSZGame::Component *>
*,std::allocator<_Ty> >::push_back(_Ty &&)': cannot convert argument 1 from
'HSZGame::SpriteComponentSystem *' to
'HSZGame::ComponentSystem<HSZGame::Component *> *const &'
我试过实现从一个对象到另一个对象的特定转换,还尝试执行一个
dynamic_cast
可以在编译时工作,但该对象在运行时为nullptr
。如果有人想知道,
SpriteComponent
确实确实继承了Component
(它是基类)。再次感谢大家的帮助! 最佳答案
首先,您要初始化一个带有std::vector<ComponentSystem<Component*>*>
和ComponentSystem
模板参数的Component*
。这意味着components
中包含的向量ComponentSystem
持有指向Component
的指针。除非您实际上打算持有指向指针的指针,否则这可能是您的错误。如果不这样做,则应将向量初始化为std::vector<ComponentSystem<Component>*>
。
其次,似乎您想使用运行时多态性,以便向量systems
不仅可以容纳ComponentSystem<Component>
对象,而且可以容纳SpriteComponentSystem
(又名ComponentSystem<SpriteComponent>
对象)。
不幸的是,该语言不允许这样做,因为模板是在编译时实例化的,并且每个实例化都是其自己的类型。语言将ComponentSystem<Component>
和ComponentSystem<SpriteComponent>
视为单独的类型,因此编译器会抱怨。
我认为您需要重新考虑这种设计理念。