gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:35:48 25 4
gpt4 key购买 nike

我知道这里有很多这样的“无法转换参数”问题,但我保证我看了很多,我认为我的特殊情况还没有被问到,而且我已经尝试调试了很多次小时,但似乎无法得到它。

基本上,我正在为 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 类中,我存储了基类的 vector ,如下所示:

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*>*>这需要 ComponentSystemComponent*模板参数。这意味着您的 vector components包含在 ComponentSystem 中持有指向 Component 的指针.这可能是你的一个错误,除非你真的想持有一个指向指针的指针。如果你不这样做,你的 vector 应该被初始化 std::vector<ComponentSystem<Component>*> .

其次,您似乎想使用运行时多态性,以便您的 vector systems不仅能装ComponentSystem<Component>对象也是SpriteComponentSystem (又名 ComponentSystem<SpriteComponent> 对象)。

不幸的是,语言不允许这样做,因为模板是在编译时实例化的,并且每个实例化都是它自己的类型。语言观点ComponentSystem<Component>ComponentSystem<SpriteComponent>作为单独的类型,因此编译器会提示。

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

关于C++:无法将参数 1 从子非模板类转换为父模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51491829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com