Xcode 8.3.1 - 编译器不能再处理循环引用?
Xcode 8.3.1 - Compiler can no longer handle circular references?
我一直在开发C++游戏引擎。在我更新到 Xcode 8.3.1!
之前,我从未遇到过任何编译器问题或类似问题
突然间,似乎在我更新时更改了默认设置,导致编译器根本无法处理循环引用。
有谁知道如何设置回来,(我试过降级 Xcode,但还是不行!)
我的循环引用看起来像这样:
- 我的代码中定义了一个名为 "Object" 的 class
- "Object" 包括另一个名为 "Renderer2D"
的 class
- "Renderer2D" 包括另一个名为 "Renderable2D"
的 class
- "Renderable2D" 扩展 "Object"
我的"Object"class:
#pragma once
#include "Graphics/2D/Renderer2D.h"
namespace kineticengine {
class Object {
public:
Object();
virtual ~Object() {}
virtual void render(graphics::Renderer2D* renderer) const;
};
}
我的"Renderer2D"class:
#pragma once
#include "Renderable2D.h"
namespace kineticengine {
namespace graphics {
class Renderer2D {
protected:
Renderer2D() {}
public:
virtual void submit(const Renderable2D* renderable) {}; // Error here, "Unknown type name 'Renderable2D', did you mean 'Renderer2D'?"
};
}
}
我的"Renderable2D"class:
#pragma once
#include "Renderer2D.h"
#include "../../Object.h"
namespace kineticengine {
namespace graphics {
class Renderable2D : public Object {
public:
Renderable2D() : Object() {}
virtual ~Renderable2D() {}
void render(Renderer2D* renderer) const override {
renderer->submit(this); // Error here "Cannot initialize parameter of type 'const kineticengine::graphics::Renderer2D *' with an rvalue of type 'const kineticengine::graphics::Renderable2D *'"
}
};
}
}
我的所有错误基本上都是 "Unknown class [x]" 的变体,其中 x 是其他 classes 之一。
如有任何帮助,我们将不胜感激!
Renderable2D.h在定义classRenderable2D之前包含了Renderer2D.h,所以当Renderer2D.h引用classRenderable2D时,还没有定义。 Clang 运行正常。
如果您只想通过指针或引用引用 class,则打破此循环的一种方法是不包含 headers。然后,您为 class 放置一个前向声明,而不是 include 指令。这还有加快编译时间的额外好处。
我一直在开发C++游戏引擎。在我更新到 Xcode 8.3.1!
之前,我从未遇到过任何编译器问题或类似问题突然间,似乎在我更新时更改了默认设置,导致编译器根本无法处理循环引用。
有谁知道如何设置回来,(我试过降级 Xcode,但还是不行!)
我的循环引用看起来像这样:
- 我的代码中定义了一个名为 "Object" 的 class
- "Object" 包括另一个名为 "Renderer2D" 的 class
- "Renderer2D" 包括另一个名为 "Renderable2D" 的 class
- "Renderable2D" 扩展 "Object"
我的"Object"class:
#pragma once
#include "Graphics/2D/Renderer2D.h"
namespace kineticengine {
class Object {
public:
Object();
virtual ~Object() {}
virtual void render(graphics::Renderer2D* renderer) const;
};
}
我的"Renderer2D"class:
#pragma once
#include "Renderable2D.h"
namespace kineticengine {
namespace graphics {
class Renderer2D {
protected:
Renderer2D() {}
public:
virtual void submit(const Renderable2D* renderable) {}; // Error here, "Unknown type name 'Renderable2D', did you mean 'Renderer2D'?"
};
}
}
我的"Renderable2D"class:
#pragma once
#include "Renderer2D.h"
#include "../../Object.h"
namespace kineticengine {
namespace graphics {
class Renderable2D : public Object {
public:
Renderable2D() : Object() {}
virtual ~Renderable2D() {}
void render(Renderer2D* renderer) const override {
renderer->submit(this); // Error here "Cannot initialize parameter of type 'const kineticengine::graphics::Renderer2D *' with an rvalue of type 'const kineticengine::graphics::Renderable2D *'"
}
};
}
}
我的所有错误基本上都是 "Unknown class [x]" 的变体,其中 x 是其他 classes 之一。
如有任何帮助,我们将不胜感激!
Renderable2D.h在定义classRenderable2D之前包含了Renderer2D.h,所以当Renderer2D.h引用classRenderable2D时,还没有定义。 Clang 运行正常。
如果您只想通过指针或引用引用 class,则打破此循环的一种方法是不包含 headers。然后,您为 class 放置一个前向声明,而不是 include 指令。这还有加快编译时间的额外好处。