Как написать специализацию метода шаблона класса?
template <int N1>
class A
{
public:
template <int N2> int func();
};
template <int N1> template <int N2> int A<N1>::func()
{ return N1+N2;
}
//template <int N1> template <> int A<N1>::func<0>() //error
//{ return N1+1;
//}
int main(void)
{
A<1> a;
int x=a.func<2>();
int y=a.func<0>();
return 0;
}
Ответы (2 шт):
Автор решения: user7860670
→ Ссылка
В этом случае можно обойтись без специализации.
template <int N1>
class A
{
public: template <int N2> int
func()
{
if constexpr (0 != N2)
{
return N1 + N2;
}
else
{
return N1 + 1;
}
}
};
Автор решения: megorit
→ Ссылка
Специализация метода требует специализации класса. А внутри класса написать такую специализацию вообще не получится. Дело в том, что такая специализация требует явного указания scope'а класса (например A<int>::), но так как мы уже находимся внутри класса, то писать его scope - тоже будет ошибкой. Такая вот весьма странная ситуация получается.
#include <concepts>
template<typename CT> class A {
public:
CT var;
template<typename FT> int func() {
if constexpr (std::same_as<FT,int>) {}
}
};
template<> template<> int A<int>::func<int>() {}
Кстати, если используются TTP (а не NTTP), то возможно так будет лучше:
template<typename CT> class A {
public:
template<typename FT> auto func(CT a1, FT a2) {
return a1 + a2;
}
};
Выведение типа возвращаемого значения из выражения return.