Votre code n'est pas une spécialisation de modèle, mais plutôt une fonction non basée sur un modèle. Il y a quelques différences là-bas. L'opérateur non-basé sur un modèle() aura la priorité sur une version modélisée (pour une correspondance exacte, mais les conversions de type ne se produira pas là), mais vous pouvez toujours forcer la fonction templated à appeler:
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
}
Dans votre le code il n'y a pas beaucoup de différence, mais si votre code doit passer le type de paramètre de modèle, il obtiendra plus drôle:
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
}
Je crois que "template <> void operator() (int données) {" dans la section du code supérieur devrait être "template <> opérateur vide() (int data) {", et dans la section du bas, "int g() {"devrait être" int g () {"dans le bas (désolé, je ne sais pas comment styliser les sections de code dans les commentaires) –
J'ai eu un doute, mais les compilateurs GCC et Comeau prennent le code comme valide. Je ne peux pas tester MSVS maintenant, si vous pouvez l'essayer, je l'apprécierais :) –
encore jeter un oeil à la réponse ici http://stackoverflow.com/questions/937744/function-template-specialization-format – stefanB