2016-04-24 46 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。這導致編譯器認爲::A::B中的C* two;字段中的不合格C指的是::C而不是::A::C

相反,聲明這些類中class A {}這樣的:

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 
    } 
}; 
}; 

在編譯器上面現在知道的C*你的意思是::A::C*因爲尋找一個匹配的類型爲C,當它遇到的class C;在聲明內部範圍爲class A {};。但是,它並不「見」::A::C下面聲明的實際定義。

有關不合格名稱查找的詳細規則可以在C++標準的§3.4.1(draft version)中找到。