Il seguente semplice pezzo di codice venga compilato, anche se non capisco perché:C++ Forward Dichiarare classi nelle classi
class C {
class B;
class A {
B getB() { return B(); }
};
class B {
};
};
int main(int, char**)
{
return 0;
}
Se poi commentare la "class C
" roba, in modo che la dichiarazione anticipata di B
, la definizione di A
e la definizione di B
sono più annidati all'interno di una classe, il codice non viene compilato, poiché B
è di un tipo incompleto:
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'
I underst e cosa significa per un tipo essere incompleto, vale a dire che non è stato ancora definito e quindi il compilatore non può forse sapere quanto spazio allocare per esso. Ma perché B
non è considerato incompleto nel codice sopra, dove A
e B
sono entrambi dichiarati e definiti all'interno di C
?
Fantastico, grazie per averlo chiarito. Ciò che ha sollevato questa particolare domanda è la classe ['result'] (http://pqxx.org/devprojects/libpqxx/doc/stable/html/Reference/) di libpqxx, che ha nidificato classi' tuple' e 'field', in quale 'tupla' costruisce un' campo' in uno dei suoi corpi funzione (ovvero, riga 183) – villapx