El siguiente código funciona con Visual Studio 2008, pero no con GCC/G ++ 4.3.4 20090804. ¿Qué comportamiento es - de acuerdo con el estándar de C++ - correcta ?GCC/VS2008: Diferente comportamiento de llamada a la función cuando la clase base con plantilla se deriva de la misma
template <int N>
struct A : A<N-1> {};
template <>
struct A<0> {};
struct B : A<1> {};
template <int N>
void Func(const A<N> &a) {}
int main()
{
A<1> a; //is derived from A<0>
Func(a); //vs2008: ok, g++: ok
//Comeau: ok
B b; //is derived from A<1>
Func(b); //vs2008: ok, g++: error, no matching function for call to Func(B&)
//Comeau: error: no instance of function template "Func" matches the
// argument list. The argument types that you used are: (B).
return 0;
}
Si Func Sobrecarga() con
void Func(const A<0> &a) { std::cout << '0'; }
void Func(const A<1> &a) { std::cout << '1'; }
siempre este último se llama (como se esperaba). Así que también esperaría que la función de plantilla fuera llamada con N = 1 porque A < 1> es base directa de B. ¿Es esta suposición realmente incorrecta?
No se compila con Comeau Online tampoco. ¿Qué esperas que sea N en el segundo caso (dado que b es convertible tanto en A <1> como en A <0>)? – UncleBens
Creo que es solo otra extensión de MSVC++. –
@UncleBens, wow, no he visto que 'B' también hereda' A <0>'!Buen ojo :) –