¿Por qué no se compila con GCC 4.4?Plantillas de función de sobrecarga en espacios de nombres
template<typename T>
class A {
public:
void foo() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (A<T> a) {
a.foo();
}
};
template<typename T>
void myfun (T x) {
Ns::do_it (x);
}
template<typename T>
class B {
public:
void bar() {
}
private:
T x;
};
namespace Ns {
template<typename T>
void do_it (B<T> b) {
b.bar();
}
};
int main() {
A<int> a;
B<int> b;
myfun (a);
myfun (b); // error: no matching function call to do_it(B<int>&)
return 0;
}
Debe tener algo que ver con el espacio de nombres de do_it
. Cuando elimino el espacio de nombres alrededor, se compila.
Antecedentes: Estoy creando un conjunto de funciones que pueden usarse con muchas clases de contenedores diferentes. Para manejar las diferentes interfaces de manera uniforme, utilizo funciones independientes que están sobrecargadas para cada una de las clases de contenedor. Estas funciones se colocarán en un espacio de nombres para evitar saturar el espacio de nombres global con ellas.
Se piensa que las definiciones para B provienen de un archivo de cabecera diferente al de A, por lo que el reordenamiento no es una opción.
¡Es un error tipográfico! El HTML tragó el. –
VS 2010 compila el código anterior, y creo que es correcto al hacerlo, pero este es un ejemplo complicado. ¡Buena pregunta! –
Lo mismo con VS2008, acabo de comprobarlo. ¿Podría ser esto un error en GCC o su interpretación es diferente de la de Microsoft? El hecho de que funcione sin un espacio de nombres indicaría que es un error, ¿no? –