Myślę, że jest tam nieporozumienie.
Istnieją dwa rodzaje szablonów:
- klasy szablon
- Metody szablon
w przykładzie, masz klasę szablonu, który oczywiście zawiera kilka metod. W takim przypadku będziesz musiał wyspecjalizować klasę.
template <class A>
class C<A,CObject>
{
void foo() { ... } // specialized code
};
Problem w przykładzie jest stosunkowo prosta: zdefiniować foo metodę specjalizacji C, ale to nigdy nie było specjalizacji oświadczył wcześniej.
Problem polega na tym, że musisz w pełni wyspecjalizować swoją klasę C (a tym samym skopiować wiele danych). Istnieje kilka obejść.
- Dziedziczenie (kompozycja?): wykonaj wszystkie typowe prace w klasie bazowej, a następnie przejmuj i klasyfikuj klasę C
- Przyjaciel: zamiast używać metody "foo" będącej członkiem C, zdefiniuj ją jako funkcję przyjazną dla znajomych i specjalizuj się tylko ta metoda
- Delegacja: mieć swój „foo” metoda wywołania innej metody „bar”, która jest bezpłatna funkcja, i specjalizują „bar” odpowiednio
które w kod daje:
// 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()); }
};
Mam nadzieję, że to wyjaśni i pomoże!
Istnieje kilka sposobów pokazanych w innych odpowiedziach: http://stackoverflow.com/questions/1501357/template-specialization-of-particular-members/1501455#1501455 –