Вопреки тому, что говорят другие ответы, вы можете специализировать функцию-член шаблона класса. Но вам нужно предоставить все аргументы шаблона
template<>
void A<int, true>::f()
{
std::cout << "true" << std::endl;
}
То, что вы пытаетесь, недействительно:
template<typename T>
void A<T, true>::f()
{
std::cout << "true" << std::endl;
}
Частичная специализация члена шаблона класса для конкретных аргументов этого шаблона класса недопустима, поэтому это означает «определить функцию-член« f »частичной специализации A для <T, true>
». Поскольку такой частичной специализации нет, компилятор выдаст ошибку.
Если вы не можете предоставить все аргументы, вы можете перегрузить f
следующим образом
template <class T, bool flag>
class A
{
template<typename, bool> struct params { };
void f()
{
f(params<T, flags>());
}
template<typename U>
void f(params<U, true>) {
std::cout << "true" << std::endl;
}
template<typename U, bool flag1>
void f(params<U, flag1>) {
std::cout << "dunno" << std::endl;
}
};