Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1489 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] warning friend declaration

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] warning friend declaration

n°1922682
amadeh
Posté le 09-09-2009 à 16:35:00  profilanswer
 

Bonjour,
Dans un fichier .h, je défini un patron de classe comme suit :

Code :
  1. template <typename T> class stack{
  2.   // constructeurs, destructeurs et méthodes membres
  3.   friend ostream& operator << (ostream&, stack<T>& );
  4. }


Dans mon fichier .cpp, je définis tout et pour ma fonction amie indépendante, j'écris :

Code :
  1. template <typename T> ostream& operator << (ostream& a, stack<T>& b){ //le code }


A la compilation, j'obtiens bien mon module objet mais j'ai un warning :
arning : friend declaration 'std::ostream& operator<< (std::ostream&, stack<T>& )' declares a non-template function
note : if this is not what you intended, make sure the function template has already been declared and add <> after the function name here
 
Je ne sais pas d'où ça vient.
Amadeh.


Message édité par amadeh le 09-09-2009 à 18:50:08
mood
Publicité
Posté le 09-09-2009 à 16:35:00  profilanswer
 

n°1922703
Joel F
Real men use unique_ptr
Posté le 09-09-2009 à 16:52:58  profilanswer
 

les friends tempalte c'est pas trivial.
Essaye
 

Code :
  1. template <typename T> class stack{
  2.   // constructeurs, destructeurs et méthodes membres
  3. template <typename U> friend ostream& operator << (ostream&, stack<U>& );
  4. }

n°1922713
amadeh
Posté le 09-09-2009 à 17:00:22  profilanswer
 

Oui merci, ça marche bien mais je ne comprends pas l'erreur dans mon code.
Ta correction fonctionne bien mais je ne la comprends pas non plus.

n°1922739
Joel F
Real men use unique_ptr
Posté le 09-09-2009 à 18:00:39  profilanswer
 

si tu mets T dans ton friend, il ne va generer un friend que pr l'instance de operator<< avec effectivement T en type specialisé.
Ici il faut lui dire que ton friend est une template avec un parametre idpt de T.

 

Apres je te dirais que friend pour operator<< est inutile. Une fonction libre est suffisante.

Message cité 1 fois
Message édité par Joel F le 09-09-2009 à 18:01:08
n°1922750
amadeh
Posté le 09-09-2009 à 18:48:52  profilanswer
 

oui d'accord j'ai compris, merci.

n°1922772
jesus_chri​st
votre nouveau dieu
Posté le 09-09-2009 à 21:22:52  profilanswer
 

Joel F a écrit :

si tu mets T dans ton friend, il ne va generer un friend que pr l'instance de operator<< avec effectivement T en type specialisé.  
Ici il faut lui dire que ton friend est une template avec un parametre idpt de T.
Apres je te dirais que friend pour operator<< est inutile. Une fonction libre est suffisante.


J'approuve, mais deux tuyaux au passage :
 
- sous certains compilo, le matching entre une free function et son argument template coince, en particulier visual .net qui est encore TRES utilisé. Si l'operator<< est le seul dans le scope, ça passe, mais s'il y en a un autre, même avec une signature complètement différente, il déraille et dit qu'il ne trouve pas ou qu'il y a ambiguité. Curieusement, déclarée en friend, l'operateur est trouvé, un peu comme un Koening's lookup. Attention c'est juste une astuce pour VC, pas une bonne règle générale.
 
- Quand tu es dans une classe template< typename T > stack<T>, ton type peut s'appeler stack, pas besoin de préciser stack<T>, ça rend les template un peu moins lourds.
 
- En définissant ta friend fonction directement dans le corps de la classe, ça serait surement passé. Les compilo on du mal avec les membres templates de template ou les template friend pour matcher la déclaration et la définition. Là comme de toute façon t'es dans un template, inline ou pas ça change pas l'organisation du code.

n°1922773
Joel F
Real men use unique_ptr
Posté le 09-09-2009 à 21:40:55  profilanswer
 

jesus_christ a écrit :


- sous certains compilo, le matching entre une free function et son argument template coince, en particulier visual .net qui est encore TRES utilisé. Si l'operator<< est le seul dans le scope, ça passe, mais s'il y en a un autre, même avec une signature complètement différente, il déraille et dit qu'il ne trouve pas ou qu'il y a ambiguité. Curieusement, déclarée en friend, l'operateur est trouvé, un peu comme un Koening's lookup. Attention c'est juste une astuce pour VC, pas une bonne règle générale.


 
VC ne fait pas d'Argument Dependant Lookup depuis VC6 :/ ...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [Résolu] warning friend declaration

 

Sujets relatifs
[RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pas[RESOLU]J2ME et la génération de timestamp...
[Résolu]pb compilation operator ++[RESOLU]Limiter le nombre de résultats d'un fichier xml
[Résolu] problème de CSS sur un menu[Résolu] Macro excel pour tri tableau par semaine
Problème nl2br ? [résolu][Résolu] Gestion des plantages
Produit matriciel avec Mysql [Résolu][Résolu] Fuite mémoire, que libérer ?
Plus de sujets relatifs à : [Résolu] warning friend declaration


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR