我一直在开发C ++游戏引擎。在更新到Xcode 8.3.1之前,我从未遇到过编译器或类似问题,
突然,当我更新时,默认设置似乎发生了变化,使得编译器无法处理循环引用。
有谁知道如何设置它,(我尝试降级Xcode,它仍然无效!)
我的循环引用看起来像这样:
我的“对象”类:
#pragma once
#include "Graphics/2D/Renderer2D.h"
namespace kineticengine {
class Object {
public:
Object();
virtual ~Object() {}
virtual void render(graphics::Renderer2D* renderer) const;
};
}
我的“Renderer2D”课程:
#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”课程:
#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是其他类之一。
任何帮助将不胜感激!
答案 0 :(得分:1)
Renderable2D.h在定义类Renderable2D之前包含Renderer2D.h,因此当Renderer2D.h引用类Renderable2D时,它尚未定义。 Clang行为正确。
如果您只是通过指针或引用引用类,则打破此循环的一种方法是不包含标题。然后,您将该类的前向声明而不是include指令。这还有加快编译时间的额外好处。