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

时间:2017-04-16 21:40:35

标签: c++ xcode compiler-errors llvm circular-reference

我一直在开发C ++游戏引擎。在更新到Xcode 8.3.1之前,我从未遇到过编译器或类似问题,

突然,当我更新时,默认设置似乎发生了变化,使得编译器无法处理循环引用。

有谁知道如何设置它,(我尝试降级Xcode,它仍然无效!)

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

  • 我的代码中定义了一个名为“Object”的类
  • “对象”包括另一个名为“Renderer2D”的类
  • “Renderer2D”包含另一个名为“Renderable2D”的类
  • “Renderable2D”扩展“对象”

我的“对象”类:

#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是其他类之一。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

Renderable2D.h在定义类Renderable2D之前包含Renderer2D.h,因此当Renderer2D.h引用类Renderable2D时,它尚未定义。 Clang行为正确。

如果您只是通过指针或引用引用类,则打破此循环的一种方法是不包含标题。然后,您将该类的前向声明而不是include指令。这还有加快编译时间的额外好处。