ça craint, c'est pas pratique, mais c'est cohérent car le truc friend peut exister disons dans deux classes
genre
class A
{
friend int func(Aà dat);
int gettype(){return 0;}
};
class B: public A
{
friend int func(A & dat)
int getttype(){return 1;}
};
class C: public A
{
friend int func(A & dat);
int gettype(){return 2;}
};
voif func(A& dat)
{
switch(datgettype())
...
traitement en fc du type
}
l'exemple est bidon, mais on voit le prob.
Soit on accepte que la ligne
friend void func()...
soit une déclaration de fonction
et dans ce cas y'a trois déclarations (identiques, soit),
soit on ne considère pas que c'est une déclaration (cf bjarne), et donc la fonction n'est pas déclarée.
donc la ligne avec friend devrait renvoyer l'erreur: connait pas cette fonction moi. (ms a le bon goût de ne pas renvoyer l'erreur et de se plaindre plus tard)
Un déclaration antérieure est donc nécessaire.
gcc, lui, accepte bien des friends, mais ne les considère pas comme déclaration. Si la fonction n'est pas connue, il ne se plaint pas (c'est l'ennui de cette façon de voir les choses).
Donc quand la fonction est définie plus tard, il regarde si son prototype appartient à la liste des amis de la classe et se comporte en conséquence.
Pour une fois que ms sacrifie l'idéalisme au pragmatisme...
A+
j'avoue, ce bug m'a bien fait chier des bulles en janvier.