Я думаю, что там есть недоразумение.
Существует два вида шаблонов:
- шаблон классов
- шаблонные методы
В вашем примере у вас есть шаблонный класс, который, конечно, содержит несколько методов. В этом случае вам придется специализировать класс.
template <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
Проблема в вашем примере относительно проста: вы определяете метод foo для специализации C, но эта специализация никогда не была заранее объявлена .
Проблема здесь в том, что вы должны полностью специализировать свой класс C (и, следовательно, копировать много данных). Есть несколько обходных путей.
- Наследование (Композиция?): Выполнять всю обычную работу в базовом классе, затем наследовать класс C и специализировать в зависимости от ситуации
- Friend: вместо того, чтобы метод 'foo' являлся членом C, определите его как функции без друзей и специализируйте только этот метод
- Делегирование: пусть ваш метод 'foo' вызывает другой метод 'bar', который является свободной функцией, и соответствующим образом специализируется на 'bar'
Который в коде дает:
// 1- Inheritance
template <class A, class B>
class CBase
{
// Everything that does not require specialization
};
template <class A, class B>
class C: public CBase<A,B>
// depending on your need, consider using another inheritance
// or even better, composition
{
void foo(); // generic
};
template <class A>
class C<A,CObject> : public CBase<A,CObject>
{
void foo(); // specialized
};
// 2- Friend
// note the change in signature:
// - now you need to pass the attributes to be changed
// - the last parameter helps differentiating the overload
// as there is no specialization for functions
template <class A, class B> void foo(Arg1&, Arg2&, const B&);
template <class A> void foo(Arg1&, Arg2&, const CObject&);
template <class A, class B>
class C
{
friend template <class, class> foo;
};
// 3- Delegation
// same signature as foo in (2)
template <class A, class B> void bar(Arg1&, Arg2&, const B&);
template <class A> void bar(Arg1&, Arg2&, const CObject&);
template <class A, class B>
class C
{
void foo() { bar(member1, member2, B()); }
};
Надеюсь, это прояснит и поможет!