У меня есть шаблон класса, давайте назовем его A
, который имеет функцию-член abc()
:
template <typename T>
class A{
public:
T value;
void abc();
};
Я могу реализовать функцию-член abc()
вне объявления класса, используя следующий синтаксис:
template <typename T>
void A<T>::abc()
{
value++;
}
Что я хочу сделать, это создать специализацию шаблона для этого класса, скажем, int
,
template <>
class A<int>{
public:
int value;
void abc();
};
Вопрос в том: Какой правильный синтаксис для реализации abc()
для специализированного класса?
Я попытался использовать следующий синтаксис:
template <>
void A<int>::abc()
{
value += 2;
}
Однако это не компилируется.
void A<int>::abc()
{
value += 2;
}
поскольку A<int>
является explicit specialisation
из A<T>
,
http://liveworkspace.org/code/982c66b2cbfdb56305180914266831d1
n3337 14.7.3 / 5
[ Пример:
Члены явно специализированного шаблона класса
определяется так же, как члены обычных классов, и не использует шаблон<> синтаксис.template<class T> struct A { struct B { }; template<class U> struct C { }; }; template<> struct A<int> { void f(int); }; void h() { A<int> a; a.f(16); } // A<int>::f must be defined somewhere // template<> not used for a member of an // explicitly specialized class template void A<int>::f(int) { /∗ ... ∗/ }
Удалить template<>
:
void A<int>::abc()
{
value += 2;
}