Dado el siguiente código:Moving Método Plantilla de saltos derivados Compilación
template<typename T>
class A
{
public:
T t;
};
class B
{
public:
void foo(int i) {}
template<typename T>
void foo(A<T>& a) {}
};
int main()
{
A<int> a;
B b;
b.foo(a );
b.foo(a.t);
}
Esto compila y funciona bien; las versiones correctas sobrecargadas de B::foo()
se eligen y llaman para a
y a.t
.
Ahora les presento una nueva clase que deriva de C
B
y mover la versión de la plantilla de ::foo()
de B
y en C
:
template<typename T>
class A
{
public:
T t;
};
class B
{
public:
void foo(int i) {}
};
class C: public B
{
public:
template<typename T>
void foo(A<T>& a) {}
};
int main()
{
A<int> a;
C c;
c.foo(a ); // Fine
c.foo(a.t); // Error
}
Y ahora el código no se compilará más. Visual Studio 2005 está declarando:
error C2784: 'void C::foo(A<T> &)' : could not deduce template argument for 'A<T> &' from 'int'
De hecho, llamando C::foo()
con cualquier int
resultados de valor en este error. Casi parece que la sobrecarga de la plantilla está ocultando la sobrecarga del método int
.
¿Por qué sucede esto? ¿Hay algún problema con el compilador de Visual Studio 2005? Desafortunadamente, no puedo probarlo en ningún otro compilador en este momento.
Se agradece cualquier información.