2016-04-24 10 views
2

私はこのクラスの構造を持っていますが、なぜ私はエラーが発生したのかわかりません。エラー出力のため、問題を探すのも非常に難しいです。クラス間で変数を変換する

error: cannot convert 'A::C*' to 'C*' in assignment: two = this; 

このエラーを修正するにはどうすればよいですか?

class B; 
class C; 

class A{ 
class B{ 
    public: 
    B* one 
    C* two; 
    And some methods.... 
    ... 
}; 
class C : public B{ 
    public: 
    int f; 
    C(){ 
    two = this; //here is error 
    } 
}; 
}; 
+2

'class B;'は 'class A :: B;'と同じではありません。 –

答えて

9

あなたの例では、(順序で完全修飾された、)5つの異なるクラスを宣言:::B::Cを。 ::A::A::B::A::C、あなたのコードで

class B; 
class C; 

::B、あなたはおそらくつもりはなかったグローバル名前空間、中::C宣言しているため。これにより、コンパイラは、フィールドの未修飾のCが、の代わりに::Cを指すと信じています。今Cのためのマッチングタイプを検索するとき、それは中class C;の宣言に遭遇したのでC*によってあなたは::A::C*を意味することを知っているコンパイラ上記で

class A{ 
class B; // declares ::A::B 
class C; // declares ::A::C 
class B{ 
    public: 
    B* one 
    C* two; // ::A::C* 
    And some methods.... 
    ... 
}; 
class C : public B{ 
    public: 
    int f; 
    C(){ 
    two = this; // should work now 
    } 
}; 
}; 

代わりに、このようなclass A {}内のこれらのクラスを宣言内側の範囲はclass A {};です。しかし、それは"を参照してください::A::Cの実際の定義を以下に宣言していません。

非修飾名検索の詳細な規則は、C++標準の§3.4.1セクション(draft version)にあります。

関連する問題