No puedo entender por qué este trozo de código no se compila:Espacio de nombres enfrentadas 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
}
}
estoy usando gcc 4.3.3
, y el error es:
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’
creo que debido a que en la línea 9 no hay prefijo de espacio de nombre, F(x)
debe significar definitivamente solo B::F(x)
. El compilador intenta convertir x
en su propia superclase. En mi entender, no debería. ¿Porque hace eso?
La llamada búsqueda de Koenig, de hecho, se describe en la sección 3.4.2 del estándar de C++. –
Entonces, si VS compila esto, ¿es un error? – liori
¿Podría encontrar una referencia a esa afirmación? Nunca he oído hablar de una regla como esa ... – xtofl