Creo que hay un malentendido allí.
Hay dos tipos de plantillas:
- las clases de plantilla
- los métodos plantilla
en su ejemplo, usted tiene una clase de plantilla, que por supuesto contiene algunos métodos. En este caso, tendrás que especializar la clase.
template <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
El problema en su ejemplo es relativamente simple: se define el foo método para la especialización C, pero esta especialización nunca ha sido declarado de antemano.
El problema aquí es que tienes que especializar completamente tu clase C (y copiar así muchos datos). Hay una serie de soluciones.
- Herencia (Composición?): haga todo el trabajo común en una clase base, luego haga que la clase C herede y se especialice según corresponda
- Amigo: en lugar de tener el método 'foo' como miembro de C, defínalo como un amigo libre de funciones y especialícese Sólo este método
- Delegación: tiene su método de 'foo' llamar a otro método de 'bar', que es una función gratuita, y se especializan 'bar' apropiadamente
que en código da:
// 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()); }
};
¡Espero que aclare y ayude!
Hay un par de formas mostradas en otras respuestas: http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members/1501455#1501455 –