error de tipo incompleto

Estoy tratando de hacer de la clase A un amigo de la clase B.

<code>class B;

class A{
public:
void show(const B&); // ##1## but this one works fine  
B ob;// error incomplete type

};


class B{
public:
int b;
B():b(1){}
friend class A;  

};
</code>

así que mi pregunta ¿por qué es el tipo incompleto? Pensé que cuando lo hiceclass B Es como un prototipo de una función que indica a la compilación que hay una definición en algún lugar del código.

también en el código anterior en ## 1 ## ¿por qué esto es posible?

Respuestas a la pregunta(1)

Su respuesta a la pregunta