Ваш код не является специализацией по шаблону, а скорее не шаблонной функцией. Там есть некоторые отличия. , Не шаблонный оператор() будет иметь приоритет над шаблонным версии (для точного соответствия, но преобразование типов не будет проходить там), но вы можете заставить шаблонную функцию, которая будет называться:
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
}
В вашем код есть не большая разница, но если ваш код должен передать тип параметра шаблона он будет получать смешнее:
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
}
Я считаю, что "template <> void operator() (int data) {" в верхнем разделе кода должен быть "template <> void operator() (int data) {", а в нижней части "int g() {"должно быть" int g () {"внизу (извините, я не знаю, как стилизовать разделы кода в комментариях) –
У меня были сомнения, но оба компилятора GCC и Comeau принимают код как действительный. Я не могу протестировать MSVS сейчас, если вы можете попробовать, я был бы признателен :) –
по-прежнему смотри здесь ответ http://stackoverflow.com/questions/937744/function-template-specialization-format – stefanB