Следующий простой фрагмент кода компилирует, хотя я не понимаю, почему:C++ вперед Объявление классов в классах
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'
Я underst и что это означает, что тип является неполным, а именно, что он еще не определен, и поэтому компилятор не может знать, сколько места выделяется для него. Но почему B
считается недоработанным в коде выше, где A
и B
оба объявлены и определены внутри C
?
Удивительный, спасибо, что очистили это. Что вызвало этот конкретный вопрос - это класс libpqxx ['result'] (http://pqxx.org/devprojects/libpqxx/doc/stable/html/Reference/), который имеет вложенные классы' tuple' и 'field', в который 'tuple' строит« поле »в одном из своих тел функции (а именно, строка 183) – villapx