2017-04-16 42 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