如何解决循环包含与 MinGW 中的模板化函数
我目前正在开发一款名为 Papaya 的游戏引擎。我最近遇到了一个问题,我必须上课。 Scene
和 Entity
。在 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 举报,一经查实,本站将立刻删除。