creo que la razón de este error se debe al hecho de que los argumentos por defecto en la plantilla de función aplican a su especialización también y no se le permite definir el argumento predeterminado más de una vez en C++.
considerar lo siguiente:
#include <iostream>
template<class T> void f(T t = 'a') {}
template<> void f<char>(char c)
{
std::cout << c << std::endl;
}
int main(int argc, char **argv)
{
f<char>();
}
Esto imprimirá a
lo que significa que la especialización se llama con el argumento por defecto definido en la plantilla principal.
Si necesita un argumento predeterminado diferente para cada especialidad se puede utilizar el enfoque se ilustra a continuación:
argumentos de la función por defecto
#include <iostream>
template<class T>
struct default_arg
{
static T get() { return T(); }
};
template<class T> void f(T t = default_arg<T>::get()) {}
template<>
struct default_arg<char>
{
static char get() { return 'a'; }
};
template<> void f<char>(char c)
{
std::cout << c << std::endl;
}
int main(int argc, char **argv)
{
f<char>();
}
Comentario menor: no necesita un punto y coma después de la definición de la función. – vitaut
No respondiendo realmente a la pregunta, pero ¿no sería más limpio/más fácil de usar la sobrecarga en lugar de la especialización? Para una discusión sobre sobrecarga versus especialización, vea estos artículos de Herb Sutter: [Artículo de revista de usuarios C/C++] (http://www.gotw.ca/publications/mill17.htm) y [GotW # 49] (http://www.gotw.ca/gotw/049.htm). –
+1 a @Luc. Si solo haces 'void f (char c = 'a') {}' compila perfectamente bien. –