Предположим, у вас есть:
template<class T>
class A {
template<class T1>
void foo(const T1& t1) {}
//
// Lots of other definitions (all templated)
//
};
и вы хотели бы специализироваться foo(const T1&)
но только для специализированного A<bool>
, Как это:
template<>
class A<bool> {
template<class T1>
void foo(const T1& t1) {
// Code for specialized A<boo>::foo
}
//
// Repeating the former definitions, how to avoid this ??
//
};
Но чтобы это заработало, мне нужно продублировать весь код, определенный в шаблоне класса. class A
и включите его снова в class A<bool>
,
Я пытался определить только специализацию члена:
template<>
void A<bool>::template<class T1> foo(const T1&) {}
Также это не работает:
template <class T1> void A<bool>::foo(const T1&) {}
Но компилятору это не нравится.
Как бороться с этим дублированием кода?
Синтаксис? Увидеть этот ответ. Пытаться:
template<>
template<typename T1>
void A<bool>::foo(const T1&){}
Вам, конечно, не нужно копировать весь шаблон класса.
Вы можете предоставить функцию и шаблон класса, а затем определить пару typedefs:
template<class T, class TArg>
class A
{
void foo(const TArg& arg) {}
// Lots of other definitions (all templated)
};
typedef A<MyType, MyType> NormalClass;
typedef A<MyType, bool> BoolClass;