微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环包含与 MinGW 中的模板化函数

如何解决循环包含与 MinGW 中的模板化函数

我目前正在开发一款名为 Papaya 的游戏引擎。我最近遇到了一个问题,我必须上课。 SceneEntity。在 Entity 类中存储了一个 Scene*,以便实体可以访问场景的注册表以获得模板化的帮助函数,例如 GetComponent<T>() 等。 Scene 类还将 Entity 存储为运行时的主相机。因此,Scene 类必须包含标题 Entity.h。但是,实体类不一定必须包含 Scene.h 标头。我将 Entity 类中的所有非模板化函数移动到源文件中,并在 class Scene; 中转发声明的 Entity.h。我认为由于 Entity 函数是模板化的,因此 Scene 将在编译时已知。它奏效了!但是今天当我的朋友尝试使用 MinGW-64 编译存储库时,它没有。我知道有很多方法可以修复编译错误,但我并不关心如何去做。我很好奇哪个编译器是正确的以及为什么:MSVC 或 MinGW-64。两个编译器都使用 C++17 作为标准。如果您觉得我的设计在形状或形式上存在根本缺陷,我也愿意接受反馈。我当前修复错误的计划是不在 Entity 中存储 Scene,而是将其移动到单独的 SceneRenderer 类。这是一些代码,以防我的细分不清楚:

实体.h

#pragma once

class Scene;

class Entity
{
public:
    Entity() = default;
    Entity(Scene*,uint32_t);
    ~Entity();
    
    void Destroy();
    bool Valid();

    template <typename T>
    T& GetComponent() 
    {
         return m_Scene->m_Registry.get<T>(m_EntityID);
    }

    // Other templated functions...
private:
    Scene* m_Scene;
    uint32_t m_EntityID;
};

场景.h

#pragma once

#include "Entity.h"
#include "String.h"

class Scene
{
public:
    Scene();
    ~Scene();

    Entity CreateEntity(const String& name = "Empty Entity");
    void SetSceneCamera(Entity e);

private:
    entt::registry m_Registry;
    Entity m_SceneCamera;
};

两个源文件都包含各自的实现。这段代码可以用 Visual-C++17 编译,但不能用 MinGW-w64 编译!谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。