2017-04-16 10 views
0

私は長い間C++ゲームエンジンを開発してきました。 Xcode 8.3.1にアップデートするまでは、コンパイラなどの問題は一度もありませんでした。Xcode 8.3.1 - コンパイラは循環参照を処理できません。

突然、コンパイラが循環参照を処理できないようにするために、デフォルト設定が変更されたように見えます。

誰もがこの背中を、(私はXcodeのをダウングレードしようとした、そしてそれはまだ動作しません!)

マイ円形参照は、このようなものに見える設定する方法を知ってい

:私はクラスを持っている

  • 私のコード
  • で定義された「オブジェクト」、「オブジェクト」は「Renderer2D」と呼ばれる別のクラスを含んで呼ばれる「Renderer2Dは、」レンダリング可能「「Renderable2D」
  • と呼ばれる別のクラスを含み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 *'" 
          } 
         }; 
    
        } 
    } 
    
    :2Dは、オブジェクト "

私の "オブジェクト"

#pragma once 

#include "Graphics/2D/Renderer2D.h" 

namespace kineticengine { 

    class Object { 
    public: 
     Object(); 
     virtual ~Object() {} 

     virtual void render(graphics::Renderer2D* renderer) const; 
    }; 

} 

マイクラス"」拡張します"

私のすべてのエラーは基本的には「Unknown class [x]」のバリエーションです。ここでxは他のクラス。

助けていただけたら幸いです!

+0

[代表的なテストケース](http://stackoverflow.com/help/mcve)を見ずにコメントするのはやや難しいです。 –

+0

私は例を追加 – flyingflouder86

+1

あなたが見ているエラーと一緒にいくつかの*実際の*コードを追加してください。 –

答えて

1

Renderable2D.hにはRenderable2Dクラスが定義される前にRenderer2D.hが含まれているため、Renderer2D.hがRenderable2Dクラスを参照するときはまだ定義されていません。 Clangは正しく動作しています。

このサイクルを中断する方法の1つは、ポインタまたは参照でクラスを参照する場合のみヘッダーを含めないことです。次に、includeディレクティブの代わりにクラスの前方宣言を入れます。これには、コンパイル時間の高速化の追加ボーナスもあります。

+0

私が得意でないのは、なぜclangが0のエラーと0の警告でコンパイルされていたのかということです。今はすべてがうんざりです! – flyingflouder86

関連する問題