我知道这里有很多“无法转换参数”的问题,但我保证我已经环顾四周,而且我认为尚未询问我的特殊情况,而且我已经尝试调试了好几个小时,但可以似乎没有得到。

基本上,我正在为2D游戏引擎创建组件系统。我将逻辑分为两部分:ComponentComponentSystemComponent类将仅存储数据,而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>视为单独的类型,因此编译器会抱怨。

我认为您需要重新考虑这种设计理念。

07-24 09:44