Следующий простой фрагмент кода компилируется, хотя я не понимаю, почему:
class C {
class B;
class A {
B getB() { return B(); }
};
class B {
};
};
int main(int, char**)
{
return 0;
}
Если я затем прокомментирую материал "class C", так что объявление вперед B, определение A и определение B больше не вложены в класс, код делает не компилируется, так как B имеет неполный тип:
main.cpp: In member function 'B A::getB()':
main.cpp:6: error: return type 'struct B' is incomplete
main.cpp:6: error: invalid use of incomplete type 'struct B'
main.cpp:3: error: forward declaration of 'struct B'
Я понимаю, что это означает, что тип является неполным, а именно, что он еще не определен, и поэтому компилятор не может знать, сколько места выделяется для него. Но почему B не считается неполным в коде выше, где A и B объявлены и определены внутри C?