Salut,

Voilà, je lis actuellement C++ template: The complete guide (très bon livre soit dit en passant) et dans cet ouvrage il est question du problème de l'injection des noms lors d'une déclaration d'amitié dans le namespace qui englobe la classe dans laquelle a lieu cette déclaration. Pour voir si j'ai bien compris le problème j'ai donc fait un petit programme qui illustre ce thème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
#include <iostream>
 
#ifdef _WIN32
#define __PRETTY_FUNCTION__ __FUNCTION__
#endif
 
void print();
 
namespace A
{
  class Test
  {
    friend void print(); //Injection de print dans A
    friend void print2(const Test &); //Injection de print2 dans A
  };
 
  void callPrint()
  {
    print(); //Normalement ici A::print n'est pas visible c'est donc ::print qui est appelée
    print2(Test()); //Ici A::print2 est visible grâce à l'ADL c'est donc A::print2 qui est appelée et l'édition de lien doit échouer puisque A::print2 n'est pas définie
  }
}
 
void print()
{
  std::cout << __PRETTY_FUNCTION__ << std::endl;
}
 
void print2(const A::Test &)
{
  std::cout << __PRETTY_FUNCTION__ << std::endl;
}
 
int main(void)
{
  A::callPrint();
  return 0;
}
Le problème c'est qu'avec le compilateur de Visual C++ 2005 j'ai un message à l'édition de lien qui m'indique que A::print n'est pas définie. Ma question est donc : est-ce que je n'ai rien compris ou bien est-ce un "bug" du compilateur de Windows ?

D'avance merci pour vos réponses