erro de tipo incompleto

Estou tentando fazer da classe A uma amiga da classe 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>

então minha pergunta porque é tipo incompleto? Eu pensei que quando eu fizclass B é como um protótipo de uma função que diz à compilação que existe uma definição em algum lugar no código.

também no código acima em ## 1 ## porque isso é possível?

questionAnswers(1)

yourAnswerToTheQuestion