#include <iostream>
template <class T>
void foo(T) {
std::cout << "foo(T)" << std::endl;
}
template <class T>
void foo(T*) { //#3
std::cout << "foo(T*)" << std::endl;
}
#define TEST
#ifdef TEST
template <>
void foo(int*) { //#1
std::cout << "foo(int*)" << std::endl;
}
#else
template <>
void foo<int*>(int*) { //#2
std::cout << "foo<int*>(int*)" << std::endl;
}
#endif
int main(int argc, char **argv) {
int* p = 0;
foo(p);
return 0;
}
cuál es la diferencia entre # 1 y # 2. Si defino TEST, trabajo # 1. Pero si lo comento, trabajo # 3 ... Y cuál es la forma correcta de escribir la especialización de plantilla de función ...¿Error en la especialización de la plantilla de función?
Hay algunos contextos en los que es conveniente o necesario especificar el parámetro de plantilla (s) . El lugar obvio donde es necesario especificar los argumentos es si el argumento de la plantilla no se deduce. Los lugares donde es conveniente es cuando necesita dirigir el argumento a un tipo adecuadamente convertido. Cuando quiera especificar explícitamente el argumento, a menudo no puede usar la sobrecarga. –