Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

template : surcharge d'operateur

4 réponses
Avatar
Beldin
Bonjour à tous.
J'ai cherché dans les archives, mais ce que j'y ai trouvé n'a pas résolu mon
problème.

je cree une class A en template et j'essaie de surcharger l'operateur <<
pour pouvoir faire :

A<int> Aentier(17);
std::cout<<Aentier<<std::endl;

A<double> Adouble(1.234);
std::cout<<Adouble<<std::endl;

j'ai donc déclaré friend l'operateur << d'ostream (voir plus bas),comme pour
une classe normale, mais ca ne marche pas, le compilateur me dit:
friend declaration class ostream & operator<<(ostream &, const A<T> &)
declares a non-template function
en me signalant la ligne marquée ***.

Je ne comprend pas le sens de ce message.
Il est vrai que la meme chose sans le template marche tres bien.
Pouvez vous me dire ce qui ne va pas ?
merci


voici un bout de mon code:

#include <iostream>
template <class T>
class A {
*** friend ostream & operator<<(ostream&,const A<T>&); ***
public : // constructeur, destructeur, methodes d'acces
private : T maData;
};

template <class T>
ostream &operator<<(ostream &sortie,const A<T> &X)
{
sortie<<"voici la valeur : "<<A.getData() ;
return sortie;
}

4 réponses

Avatar
Jean-Marc Bourguet
"Beldin" writes:

J'ai cherché dans les archives, mais ce que j'y ai trouvé n'a pas
résolu mon problème.


Peux-tu dire ce que tu as trouve et pourquoi ca ne resous pas ton
probleme. Je ne peux que repeter ce que j'ai dit dans les messages



et



google:

template friend group:fr.comp.lang.c++

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

Avatar
Christophe Bourez
"Beldin" wrote in message
news:bdrftn$4v7$

voici un bout de mon code:

#include <iostream>
template <class T>
class A {


Peut-être qu'une prédéclaration de l'opérateur peut aider le compilo.

template <class T> class A;
template <class T> std::ostream &operator<<(std::ostream &sortie,const A<T>
&X);

*** friend ostream & operator<<(ostream&,const A<T>&); ***


(Hors sujet:
Comme tu ne mets pas les portées sur std, je suppose que tu fais un using
namespace std dan ton .h
J'éviterais un tel using dans un .h, ça pourrait amener tôt ou tard du name
clashing par simple inclusion).

Si ton compilo est "standard compliant", essaie plutôt
template<> friend std::ostream &operator<< (std::ostream &, const A<T> &);

public : // constructeur, destructeur, methodes d'acces
private : T maData;
};

template <class T>
ostream &operator<<(ostream &sortie,const A<T> &X)
{
sortie<<"voici la valeur : "<<A.getData() ;
return sortie;
}


Je ne sais pas quel compilo tu utilises, mais sache que les friends
templates sont correctement supportés depuis peu.
Si ma mémoire est bonne, ils n'étaient pas encore (ou mal) supportés par
VC++ 6, ni par BCB5.

Christophe Bourez

Avatar
Christophe Bourez
"Christophe Bourez" wrote in message
news:bdrjbp$qnv$

"Beldin" wrote in message
news:bdrftn$4v7$

voici un bout de mon code:

#include <iostream>
template <class T>
class A {


Peut-être qu'une prédéclaration de l'opérateur peut aider le compilo.

template <class T> class A;
template <class T> std::ostream &operator<<(std::ostream &sortie,const
A<T>

&X);


Et donc, avant la classe!!


*** friend ostream & operator<<(ostream&,const A<T>&); ***


(Hors sujet:
Comme tu ne mets pas les portées sur std, je suppose que tu fais un using
namespace std dan ton .h
J'éviterais un tel using dans un .h, ça pourrait amener tôt ou tard du
name

clashing par simple inclusion).

Si ton compilo est "standard compliant", essaie plutôt
template<> friend std::ostream &operator<< (std::ostream &, const A<T> &);

public : // constructeur, destructeur, methodes d'acces
private : T maData;
};

template <class T>
ostream &operator<<(ostream &sortie,const A<T> &X)
{
sortie<<"voici la valeur : "<<A.getData() ;
return sortie;
}


Je ne sais pas quel compilo tu utilises, mais sache que les friends
templates sont correctement supportés depuis peu.
Si ma mémoire est bonne, ils n'étaient pas encore (ou mal) supportés par
VC++ 6, ni par BCB5.

Christophe Bourez







Avatar
Beldin
ok merci a vous.
je pensais que le problème venait de operator<< alorsque c'est de friend
qu'il s'agit.