Su código no es una especialización de plantilla, sino más bien una función sin plantilla. Hay algunas diferencias allí. El operador no moldeado() tendrá prioridad sobre una versión de plantilla (una coincidencia exacta, pero las conversiones de tipos no tendrá lugar allí) pero todavía se puede forzar la función de plantilla que se llamará:
class Visitor
{
public: // corrected as pointed by stefanB, thanks
template <typename T>
void operator()(T data) {
std::cout << "generic template" << std::endl;
}
void operator()(bool data) {
std::cout << "regular member function" << std::endl;
}
};
template <> // Corrected: specialization is a new definition, not a declaration, thanks again stefanB
void Visitor::operator()(int data) {
std::cout << "specialization" << std::endl;
}
int main()
{
Visitor v;
v(5); // specialization
v(true); // regular member function
v.operator()<bool>(true); // generic template even if there is a non-templated overload
// operator() must be specified there (signature of the method) for the compiler to
// detect what part is a template. You cannot use <> right after a variable name
}
En su código no hay mucha diferencia, pero si su código tiene que pasar el tipo de parámetro de plantilla que obtendrá más divertido:
template <typename T>
T g() {
return T();
}
template <>
int g() {
return 0;
}
int g() {
return 1;
}
int main()
{
g<double>(); // return 0.0
g<int>(); // return 0
g(); // return 1 -- non-templated functions take precedence over templated ones
}
Creo que "template <> void operator() (int data) {" en la sección superior del código debe ser "template <> void operator() (int data) {", y en la sección inferior, "int g() {"debería ser" int g () {"en la parte inferior (lo siento, no sé cómo estilizar las secciones de código en los comentarios) –
Tenía una duda allí, pero los compiladores GCC y Comeau toman el código como válido. No puedo probar MSVS ahora, si puedes probarlo, te lo agradecería :) –
todavía eche un vistazo a la respuesta aquí http://stackoverflow.com/questions/937744/function-templates-specialization-format – stefanB