Это недопустимо, потому что вы не можете явно специализировать функцию-член, не задавая фиксированные аргументы шаблона для любого шаблона класса.
Не совместим с C ++ 11, но работает на MSVC
Компилятор Microsoft имеет расширение, которое позволяет объявлять явные специализации в шаблонах классов. Хотя я никогда не пробовал, есть вероятность, что он примет следующий нестандартный код
template <int I>
class A<char, I>
{
public:
template <typename T2> void f(T2 x);
template<> void f<double>(double x) {
}
/*...*/
};
Обновление: Clang компилирует это и сообщает
// clang++ -fms-extensions main1.cpp
main1.cpp:10:21: warning: explicit specialization of 'f' within class scope is a
Microsoft extension [-Wmicrosoft]
template<> void f<double>(double x) {
^
C ++ 11 / C ++ 03 совместим
Путь здесь - перегрузка вместо специализации
template <int I>
class A<char, I>
{
public:
template <typename T2> void f(T2 x);
void f(double x) {
}
/*...*/
};