我知道这里有很多“无法转换参数”的问题,但是我保证我已经环顾四周,而且我认为尚未询问我的特殊情况,而且我已经尝试调试了很多小时,但似乎无法获得。
基本上,我正在为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
。再次感谢大家的帮助!
答案 0 :(得分:1)
首先,您正在初始化一个std::vector<ComponentSystem<Component*>*>
和一个ComponentSystem
模板参数的Component*
。这意味着components
中包含的向量ComponentSystem
正在持有指向Component
的指针。除非您实际上打算持有指向指针的指针,否则这可能是您的错误。如果不这样做,则应初始化向量std::vector<ComponentSystem<Component>*>
。
第二,您似乎想使用运行时多态性,以便向量systems
不仅可以容纳ComponentSystem<Component>
个对象,还可以容纳SpriteComponentSystem
(又称ComponentSystem<SpriteComponent>
个对象)。 / p>
不幸的是,该语言不允许这样做,因为模板是在编译时实例化的,并且每个实例化都是其自身的类型。语言将ComponentSystem<Component>
和ComponentSystem<SpriteComponent>
视为单独的类型,因此编译器会抱怨。
我认为您需要重新考虑这种设计理念。