Salut,
Quand tu fais ça:
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:
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
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().
Partager