Problème de spécialisation de fonction template membre

Bonjour à tous.
Je dispose du code suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A{ /**/};
 
class B : public A{ /**/};
 
class C : public A {
/**/
std::vector<A*> m_liste;
template <class TYPE> TYPE& Add(TYPE* t)
{
m_liste.push_back(t);
return (*t);
}
 
};
Avec cette fonction , je veux pouvoir ajouter des objets de type B et C.
Sauf que si l'objet est de type B, la fonction ne doit rien renvoyer.

J'ai donc écris:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
class C //...
{
//..
template <> void Add(B* t)
{
m_liste.push_back(t);
}
//...
};
Mais dans ce cas, gcc me dit que la spécialisation doit avoir lieu dans le namespace qui contient C.
explicit specialization in non-namespace scope ‘class C’
Pas de problème :

on met la fonction membre dans le namespace globale
:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
template <> void C::Add<B>(B* t)
{
m_liste.push_back(t);
}
mais la GCC me dit :

error: template-id ‘Add<B>’ in declaration of primary template
error: prototype for ‘void C::Add(B*)’ does not match any in class ‘C’
error: candidate is: template<class TYPE> TYPE& C::Add(TYPE*)
Et si j'ajoute le 'prototype' de la spécialisation dans la classe,j'ai la 1er erreure en plus des précédantes.

Une idée ?

Merci.