the template guide geeksforgeeks example c++ templates

template - typedef c++



¿Por qué no se puede especificar el argumento predeterminado para una especialización de plantilla explícita? (3)

C ++ 98 §12.7 / 21 "Los argumentos de función predeterminados no se especificarán en ... la especialización explícita de una plantilla de función".

Con respecto a la lógica, creo que tiene que ver con una llamada que siempre se resuelve con la plantilla principal. Una llamada que deja de lado un argumento requerido por la plantilla principal, no se pudo resolver sin cambiar las reglas de búsqueda.

El siguiente código no pudo pasar la compilación, ¿cuál es la consideración para este error del compilador?

template<class T> void f(T t) {}; template<> void f<char>(char c = ''a'') {}

Mensaje de error: los argumentos predeterminados no están permitidos en una especialización explícita de una plantilla de función


Creo que la razón detrás de este error se debe al hecho de que los argumentos predeterminados en la plantilla de función también se aplican a su especialización y no se le permite definir el argumento predeterminado más de una vez en C ++.

Considera 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 significado que se llama especialización con el argumento predeterminado definido en la plantilla principal.

Si necesita un argumento predeterminado diferente para cada especialización, puede utilizar el enfoque ilustrado a continuación:

#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>(); }


La instancia de la plantilla particular utilizada se decide por el tipo del argumento de la función. De este modo, en este caso, la especialización explícita se selecciona al proporcionar un argumento char; es solo en este punto que el argumento predeterminado entraría en juego, donde ahora es redundante.

Sólo tiene sentido proporcionar argumentos predeterminados en la propia declaración de plantilla. La desventaja es que tiene que especificar la especialización adecuada, a saber, f<char>() , que elimina algunas de las ventajas de usar un argumento predeterminado en primer lugar.

Para lograr el comportamiento que creo que quieres, usa lo siguiente:

template<class T> void f(T t) {} template<> void f<char>(char c) {} void f() { f(''a''); }