2017-02-08 11 views
2

は、私はこのエラーを取得する:C++シンプルな循環参照と前方宣言の問題

error C3646: 'bar': unknown override specifier

2015のVisual Studioで、この非常に単純なC++コードをコンパイルしようとしている:

main.cppに

#include "Foo.h" 

int main() 
{ 
    return 0; 
} 

foo.h

#pragma once 

#include "Bar.h" 

class Foo 
{ 
public: 
    Foo(); 

    Bar bar; 
}; 

Bar.h

#pragma once 

#include "Foo.h" 

class Bar 
{ 
public: 
    Bar(); 
}; 

私はそれぞれの.hが他方を含み、そしてこの溶液を前方宣言を使用する必要がありますので、循環参照があり得るが、彼らはいないようです誰かが理由を説明することができますか?私はここで同様の問題を発見し、ソリューションは常に同じです、私は何かが不足していると思う:)

+2

あなたの前方宣言はどこですか? – nwp

+1

'Foo'の前に' Bar'という前方宣言を使いたい場合、コンパイラはその時点で 'Bar'のサイズを知っている必要があるので、' Bar bar; 'はエラーですが、' Bar *バー。 –

答えて

2

循環参照は完全に独自のものであり、バーから#include "Foo.h"を削除することで安全に削除できます。 H:

#pragma once 

//#include "Foo.h" <---- not necessary, Bar does not depend on Foo 

class Bar 
{ 
public: 
    Bar(); 
}; 

あなたはFoo.h内部Barの前方宣言は必要ありません。より一般的なケースは、FooBarが相互に依存していた場合、前方宣言が必要です。

+0

確かに、しかし、もし彼らが相互に依存しているなら、それをどうやって修正するのですか? – JoePerkins

+1

@JoePerkinsこれは別の質問の対象ですが、通常は次のように相互にポインタを持つクラスを持つことができます: 'class Foo;クラスバー{Foo * f; };クラスFoo {Bar * b; };しかし、相互に非ポインタメンバーを含むクラスを持つことはできません。 – TemplateRex

+0

解決策は代わりにポインタを持つことです。私はC++を学んでいる間、その情報を完全に逃しました! – JoePerkins