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).
'Klasse B;' ist nicht dasselbe wie 'Klasse A :: B;' –