Salut,
Quand tu fais ça:
Code:
1 2 3 4 5 6 7
| namespace A
{
void callPrint()
{
print(); //Normalement ici A::print n'est pas visible c'est donc ::print qui est appelée
}
} |
Ca dépend des compilateurs, mais la fonction print n'étant pas déclarée, certains la traitent comme A::print (vu que ni A::print, ni print n'existent encore)
C'est pourquoi ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream>
#ifdef _WIN32
#define __PRETTY_FUNCTION__ __FUNCTION__
#endif
void print();
namespace A
{
class Test
{
friend void print(); //Injection de print dans A
};
void callPrint()
{
::print(); //Normalement ici A::print n'est pas visible c'est donc ::print qui est appelée
}
}
void print()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main(void)
{
A::callPrint();
return 0;
} |
marche normalement. (sous minGW)
Avec le temps, peut-être que tous les compilateurs auront plus d'intelligence :mrgreen:
Néanmoins, affaire de goût personnel, j'ai préféré déclarer print avant, dans mon post précédent.
Apparement ici, le problème ne vient donc pas du friend mais de la fonction A::CallPrint().