OVH Cloud OVH Cloud

template et friend

1 réponse
Avatar
Nico
Bonjour,

J'ai la classe suivante :

template <class x>
class vecteur {
...
// IC définie
friend ostream& operator<< (ostream&, const vecteur<x> &V) ;
// surcharge de <<
...


et le .cpp qui correspond :

template <class x>
ostream& operator << (ostream& flux, const vecteur<x> &V) {
for ( int i=0 ; i < V.taille ; i++ ) {
flux << "| " << V.tab[i] << " " ;
}
flux << "|" ;
return flux ;
}

Or ça ça bug sévère à la compile

Et il faut déclarer ça pour que ça marche (dans le .h) :

// IC définie
template <class temp>
friend ostream& operator<< (ostream&, const vecteur<temp> &V) ;
// surcharge de <<

Comment ça se fait ? quelques explications ?

Nico

1 réponse

Avatar
Jean-Marc Bourguet
Nico writes:

template <class x>
class vecteur {
...
// IC définie
friend ostream& operator<< (ostream&, const vecteur<x> &V) ;
// surcharge de <<
...



Ce que tu declares friend, c'est une fonction non template. Or tu
utilises une fonction template:

et le .cpp qui correspond :
(au fait, les definitions de template etant generalement utilisees

dans plus d'une unite de compilation se trouvent generalement dans des
.hpp... pour plus de details, faire une recherche avec export et
template dans ce groupe)

template <class x>
ostream& operator << (ostream& flux, const vecteur<x> &V) {
for ( int i=0 ; i < V.taille ; i++ ) {
flux << "| " << V.tab[i] << " " ;
}
flux << "|" ;
return flux ;
}


or tu desirerais que ce soit une instanciation d'un template. Ta solution
// IC définie
template <class temp>
friend ostream& operator<< (ostream&, const vecteur<temp> &V) ;
// surcharge de <<


declare comme friend toute les instanciations. Si tu ne veux declarer
que l'instanciation sur le bon type:
friend ostream& operator<< <x> (ostream&, const vecteur<x> &V) ;

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org