2016-04-24 4 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* 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).

Смежные вопросы