2017-04-16 65 views
0

我一直在开发C++游戏引擎很长一段时间。我从来没有遇到任何有关编译器的问题,或类似的东西,直到我更新到Xcode 8.3.1!Xcode 8.3.1 - 编译器不能再处理循环引用?

突然,当我更新时,默认设置被更改,使得编译器无法处理循环引用。

有谁知道如何设置回来,(我想降级的Xcode,它仍然无法正常工作!)

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

  • 我有一个类所谓的“对象”在我的代码定义
  • “对象”包括所谓的“Renderer2D”其他类
  • “Renderer2D”包括所谓的“Renderable2D”
  • “渲染另一个类2D”扩展 “对象”

我的 “对象” 类:

#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

如果没有看到[代表性测试用例](http://stackoverflow.com/help/mcve),有点难以评论。 –

+0

我添加了一个示例 – flyingflouder86

+1

请添加一些* actual *代码,以及您看到的错误。 –

回答

1

Renderable2D.h在定义类Renderable2D之前包含Renderer2D.h,所以当Renderer2D.h引用类Renderable2D时,它尚未定义。铿锵行为正确。

如果您只打算通过指针或引用来引用类,那么打破此循环的一种方法是不包含标头。然后您为该类放置前向声明而不是include指令。这也加快了编译时间的好处。

+0

我只是没有得到的是为什么铿锵编译与0错误和0警告之前,现在它都搞砸了! – flyingflouder86