【问题标题】:Xcode 8.3.1 - Compiler can no longer handle circular references?Xcode 8.3.1 - 编译器不能再处理循环引用?
【发布时间】:2017-04-16 21:40:34
【问题描述】:

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

突然,当我更新它时,似乎更改了默认设置,因此编译器根本无法处理循环引用。

有谁知道如何设置它,(我尝试降级 Xcode,但它仍然不起作用!)

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

  • 我的代码中定义了一个名为“Object”的类
  • “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 *'"
            }
        };

    }
}

我所有的错误基本上都是“未知类 [x]”的变体,其中 x 是其他类之一。

任何帮助将不胜感激!

【问题讨论】:

  • 如果没有看到representative test-case,就很难发表评论。
  • 我加了一个例子
  • 请添加一些实际代码以及您看到的错误。
  • 这样更好吗?
  • 在尝试重现此内容时,我不得不进行太多更改。你能进一步减少这个问题吗?

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


【解决方案1】:

Renderable2D.h在定义类Renderable2D之前包含了Renderer2D.h,所以当Renderer2D.h引用类Renderable2D时,还没有定义。 Clang 的行为正确。

如果您只想通过指针或引用来引用一个类,那么打破这种循环的一种方法是不包含标题。然后,您为类 in 而不是 include 指令放置一个前向声明。这还具有加快编译时间的额外好处。

【讨论】:

  • 我只是不明白为什么clang之前编译时出现0个错误和0个警告,现在一切都搞砸了!
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2011-04-12
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多