2015-09-04 4 views
1

Я нашел следующий пример на одном из моих курсов на C++. Когда я пытаюсь скомпилировать его, я получаю следующую ошибку:'B :: operator A' использует неопределенный класс 'A'

'B::operator A' uses undefined class 'A' 

Почему говорится, что класс A не определен?

#include<iostream> 
using namespace std; 

class A; 
class B 
{ 
    int x; 
public: B(int i = 107) { x = i; } 
     operator A(); 
}; 
B::operator A() { return x; } 

class A 
{ 
    int x; 
public: A(int i = 6) { x = i; } 
     int get_x() { return x; } 
}; 

int main() 
{ 
    B b; 
    A a = b; 
    cout << a.get_x(); 
    system("Pause"); 
} 
+2

Вы не можете использовать это с помощью прямого объявления. В этом случае декларация 'A' должна идти до объявления' B'. В вашем случае разрешены только указатели или ссылки. –

ответ

3

компилятор должен знать, что А здесь:

B::operator A() { return x; } 

Но у вас есть только опережающее объявление. Вы должны переместить объявление класса A выше B

Вам разрешается только использовать указатели или ссылки неполных типов, является то, что есть, когда вы forward declare типа

2

Вы должны объявить выше B, так что определение A является видимым B.

#include<iostream> 
using namespace std; 

class A 
{ 
    int x; 
public: A(int i = 6) { x = i; } 
     int get_x() { return x; } 
}; 


class B 
{ 
    int x; 
public: B(int i = 107) { x = i; } 
     operator A(); 
}; 
B::operator A() { return x; } 

int main() 
{ 
    B b; 
    A a = b; 
    cout << a.get_x(); 
} 

Это должно сработать.

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