friend surcharge class template

friend surcharge class template - C++ - Programmation

Marsh Posté le 15-11-2005 à 17:37:02    

Bonsoir,
dans une classe template la déclaration friend ne fonctionne pas !?!?
Alors que dans une classe normale ce code fontionne.
Quelqu'un peut me dire pourquoi ?
 
Message d'erreur : Queue<string>::first_' is not accessible
 
template <class T>
  class Queue
    {
    friend ostream& operator<< <>(ostream &o, const Queue<T> &queue) ;
 
    private :
      Node<T>* first_ ;
      Node<T>* last_ ;
      int size_ ;
      ......    
      } ;
 
    template <class T>
    ostream& operator<<(ostream& o, const Queue<T>* &queue)
    {
    Node<T>* n = queue->first_ ; // pas accès à first_  alors que ça été déclaré friend !
    while (n)
      {
      o << *(n->data_) << "\t" ;
      n = n->next_ ;
      }
     return o ;
     }
 
PS : je préfère friend, au getter/setter pour question de performance :)  
Voilà, merci

Reply

Marsh Posté le 15-11-2005 à 17:37:02   

Reply

Marsh Posté le 15-11-2005 à 19:26:26    

commence par mettre le meme prototype dans la déclaration friend que dans la définition.
 
ensuite, on ne spécialise pas une fonction template avant d'avoir déclaré cette fonction template.
 

Code :
  1. template <class T> class Queue;
  2. template <class T>
  3. ostream& operator<<(ostream& o, const Queue<T> &queue) ;
  4. template <class T>
  5.   class Queue
  6.     {
  7.     friend ostream& operator<< <>(ostream &o, const Queue<T> &queue) ;
  8.      //...
  9.       } ;
  10.     template <class T>
  11.     ostream& operator<<(ostream& o, const Queue<T> &queue)
  12.     {
  13.      // ...
  14.      return o ;
  15.      }


 
Je ne connais pas de méthode moins élégantes pour faire ça.
Pour plus élégant, prend ton bouton recherche, tu va trouver plusieurs réponses dans les posts de moins de 48 heures :o
 

Citation :

PS : je préfère friend, au getter/setter pour question de performance :)  


elle est bien bonne celle la :)

Reply

Marsh Posté le 15-11-2005 à 19:37:53    

PAS DE FRIEND PUTAIN :O

Reply

Marsh Posté le 15-11-2005 à 19:47:03    

pour la milième fois
 

Code :
  1. #include <iostream>
  2. using std::ostream;
  3. template<typename T>
  4. struct Foo
  5. {
  6.   void print(ostream &os) const;
  7. };
  8. template<typename T>
  9. inline ostream& operator<<(ostream &o, const Foo<T> &f)
  10. {
  11.   f.print(o);
  12.   return o;
  13. }

Reply

Sujets relatifs:

Leave a Replay

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