[Résolu] warning friend declaration

warning friend declaration [Résolu] - C++ - Programmation

Marsh Posté le 09-09-2009 à 16:35:00    

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
Reply

Marsh Posté le 09-09-2009 à 16:35:00   

Reply

Marsh Posté le 09-09-2009 à 16:52:58    

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. }

Reply

Marsh Posté le 09-09-2009 à 17:00:22    

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.

Reply

Marsh Posté le 09-09-2009 à 18:00:39    

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
Reply

Marsh Posté le 09-09-2009 à 18:48:52    

oui d'accord j'ai compris, merci.

Reply

Marsh Posté le 09-09-2009 à 21:22:52    

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.

Reply

Marsh Posté le 09-09-2009 à 21:40:55    

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 :/ ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed