Je ne comprends pas pourquoi ce morceau de code ne compile pas:Namespace Clashing en C++
namespace A {
class F {}; // line 2
class H : public F {};
}
namespace B {
void F(A::H x); // line 7
void G(A::H x) {
F(x); // line 9
}
}
J'utilise gcc 4.3.3
, et l'erreur est:
s3.cpp: In function ‘void B::G(A::H)’:
s3.cpp:2: error: ‘class A::F’ is not a function,
s3.cpp:7: error: conflict with ‘void B::F(A::H)’
s3.cpp:9: error: in call to ‘F’
Je pense que parce que, dans la ligne 9 il n'y a pas de préfixe d'espace de nommage, F(x)
devrait signifier définitivement seulement B::F(x)
. Le compilateur essaie de lancer x
dans sa propre super-classe. À ma connaissance, cela ne devrait pas être le cas. Pourquoi ça fait ça?
Ce que l'on appelle la consultation de Koenig, en fait, décrit dans la section 3.4.2 de la norme C++. –
Ensuite, si VS compile ceci, c'est un bug? – liori
Pourriez-vous trouver une référence à cette déclaration? Je n'ai jamais entendu parler d'une telle règle ... – xtofl