2016-04-24 14 views
2

Ich habe diese Struktur der Klasse und ich weiß nicht, warum ich Fehler habe. Es ist sehr schwierig, ein Problem wegen der Fehlerausgabe zu suchen.Konvertieren von Variablen zwischen Klassen

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

Wie kann ich diesen Fehler beheben?

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

'Klasse B;' ist nicht dasselbe wie 'Klasse A :: B;' –

Antwort

9

Ihr Beispiel erklärt 5 verschiedene Klassen (voll qualifiziert, in dieser Reihenfolge): ::B, ::C; ::A, ::A::B und ::A::C, weil in Ihrem Code

class B; 
class C; 

::B und ::C im globalen Namespace erklärt, die Sie wahrscheinlich nicht die Absicht haben. Dies veranlasste den Compiler zu der Annahme, dass sich das unqualifizierte C in dem C* two; Feld in ::A::B auf ::C statt ::A::C bezieht.

erklären Statt diese Klassen innerhalb class A {} wie folgt aus:

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

In der über dem Compiler weiß jetzt, dass durch C* Sie ::A::C* bedeuten, denn wenn nach einem passenden Typ für C Suche er die Erklärung der class C; in der Begegnungen innerer Bereich von class A {};. Es ist jedoch nicht "siehe" die tatsächliche Definition von ::A::C unten angegeben.

Detaillierte Regeln für die Suche nach nicht qualifizierten Namen finden Sie im Abschnitt §3.4.1 des C++ - Standards (draft version).

Verwandte Themen