Bien le bonjour tout le monde,

j'ai un petit soucis et je cherche la façon la plus élégante de le résoudre.

J'ai une classe Mere, que je pourrais présenter comme suit, et son opérateur d'indirection de flux:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
class Mere
{
friend std::ostream & operator << ( std::ostream & ostr, const Mere & mere );
 
public:
   std::string name;
   int value;
};
Il se trouve que, les spécifications ayant changées, je dois implémenter différents comportements pour cette classe Mere. J'ai donc décidé d'utiliser le pattern template method et j'ai créé 2 classes Filles qui héritent de Mere et qui possèdent les même attributs. Seules quelques fonctions membres changent (c'est un cas typique de spécialisation):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
class Fille1 : public Mere
{ // code };
 
class Fille2 : public Mere
{ // code };
Maintenant ça se complique: j'ai une classe conteneur template, qui est vouée à prendre en paramètre template une des deux classes filles (j'ai fais comme ça car je suis sûr que les specs vont encore changer et qu'il va me falloir implémenter d'autres classes FilleX):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
template <class TypeElement> // TypeElement = Fille1 ou Fille2
class TableauDeMere
{
// ici tout mon code. c'est un gros fourre-tout ce conteneur.
private:
   std::set<TypeElement, MonFoncteurDeComparaison> m_leSet;
}
Le décor est planté, voilà le problème: je n'arrive pas à implémenter mon opérateur d'indirection de flux pour mon TableauDeMere.

J'ai essayé ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class TypeElement> // TypeElement = Fille1 ou Fille2
class TableauDeMere
{
   friend std::ostream & operator << ( std::ostream & ostr, const TableauDeMere<TypeElement> & ad );
//...
}

template <class TypeElement>
std::ostream & operator << ( std::ostream & ostr, const TableauDeMere<TypeElement> & ad )
{
	std::copy( ad.m_leSet.begin(), ad.m_leSet.end(), std::ostream_iterator<Mere>(ostr, "\n"));
// ici, Mere me parait le plus logique puisque je sais que quelque soit le type de TypeElement, il héritera de Mere. Et je veux utiliser l'operateur << de la classe Mere justement
	return ostr;
}
Le code ci-dessus compile si je n'utilises pas l'operateur << de TableauDeMere. Lorsque je l'utilise (en essayant d'afficher un TableauDeMere<Fille1> par exemple), le compilo (j'utilise visual 2005 express ici) n'arrive pas à résoudre le typage:
error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class TableauDeMere<class Fille1> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$TableauDeMere@VFille1@@@@@Z) referenced in function _main
Voyez-vous mon problème? Voyez-vous une solution élégante?