Вы не можете специализировать шаблонную функцию;только классы шаблонов могут быть специализированными. Редактирование: ответ Наваза правильный: это частичная специализация, которая не разрешена для функций шаблона, только для классов.Возможна полная специализация:
template <class U> void f(U y) {}
template<> void f<double>(double y) {} // specialization for double
Обратите внимание, что аргумент шаблона не нужно явно указывать, если его можно вывести из контекста:
template<> void f<>(int y) {} // specialization for int
В вашем случае полная специализацияневозможно, потому что аргумент функции является классом шаблона.Однако функция шаблона, как и любая функция, может быть перегружена.В вашем случае это будет так:
template <class T>
class myC {
T x;
};
template <class U>
void f(U y) {
}
template <class T>
void f(myC<T> y) {
}
int main() {
myC<double> m;
f(m);
return 0;
}