Xcode 8.3.1 - 编译器不能再处理循环引用?

Xcode 8.3.1 - Compiler can no longer handle circular references?

我一直在开发C++游戏引擎。在我更新到 Xcode 8.3.1!

之前,我从未遇到过任何编译器问题或类似问题

突然间,似乎在我更新时更改了默认设置,导致编译器根本无法处理循环引用。

有谁知道如何设置回来,(我试过降级 Xcode,但还是不行!)

我的循环引用看起来像这样:

我的"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 指令。这还有加快编译时间的额外好处。