C ++:无法将参数1从子非模板类转换为父模板类

时间:2018-07-24 06:27:32

标签: c++ class templates base derived

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

基本上,我正在为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。再次感谢大家的帮助!

1 个答案:

答案 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>视为单独的类型,因此编译器会抱怨。

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