Ваш пример объявляет 5 различных классов (полное, по порядку): ::B
, ::C
; ::A
, ::A::B
и ::A::C
, потому что в вашем коде
class B;
class C;
объявляет ::B
и ::C
в глобальном пространстве имен, которые вы, вероятно, не намерены. Это приводит к тому, что компилятор считает, что безоговорочный C
в поле C* two;
в ::A::B
относится к ::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
, указанное ниже.
Подробные правила поиска неквалифицированного имени можно найти в разделе §3.4.1 стандарта C++ (draft version).
'class B;' не то же самое, что 'class A :: B;' –