IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Template] surcharge d'operateur dans un patron de classe


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 28
    Points
    28
    Par défaut [Template] surcharge d'operateur dans un patron de classe
    Salut
    J'ai une classe nommée Complexe.
    j'ai fais un surcharge de l'operateur << comme suit
    Code Complex.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ostream  &operator<<( ostream &o,Complexe x)
    {
        o<<x.getreel()<<"+"<<x.getimag()<<" i ";
       return o;
    }
    et on a une Classe patron nommée CVector
    Code CVector.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template <class T> class CVector{
    .......
    ostream& operator<<(ostream& o,T x)
    {
        for(int i=0;i<m_free;i++)
        o<<x.getvalue[i]<<" ";
        return o;
    }
    ......
    Code main.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CVector <Complexe> abc(10);
    for(int i=0;i<10;i++)
    abc[i]=Complexe(i+1,2);
    cout<<abc
    Donc je veux afficher tous les elements avec cout<<abc.
    Mais ça pas marcher
    Merci de m'aider

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    implique d'appeler l'opérateur << sur cout avec un objet abc de type CVector<Complex>.
    Donc, ta surcharge devrait ressembler à quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <class T>
    ostream& operator<<(ostream& o,CVector<T> x)
    {
    ...
    }

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    J'ai fais comme ça
    mais il y a une erreur au compilation
    il m'a dit:

    `std::ostream& CVector<T>::operator<<(std::ostream&, CVector<T>)' must take exactly one argument|

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Effectivement, car tu as défini l'opérateur << comme membre de ta classe. En général, on le définit hors de la classe et on appelle une méthode adéquate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template <class T>
    ostream& operator<<(ostream& o,CVector<T> x)
    {
       return x.Afficher(o);
    }
     
    et 
    template <class T>
    ostream& CVector<T>::Afficher(ostream&o)
    {
    ...
    }
    Si tu définis l'opérateur dans la classe alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <class T>
    ostream& CVector<T>::operator<<(ostream& o)
    {
       return Afficher(o);
    }
    Rappelles-toi que l'opérateur << est binaire. Donc soit les deux opérandes sont en paramètre d'une fonction globale (solution 1), soit le premier opérande est l'objet sur lequel il s'applique et le second opérande est le paramètre (solution 2).

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    L'opérateur << ne peut être définie comme ne fonction membre car son premier argument doit forcément être un flux. Or, implicitement, les fonction membre recoive this en 1er paramètre >> boom.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

Discussions similaires

  1. Réponses: 13
    Dernier message: 04/08/2013, 09h38
  2. Surcharge d'opérateur dans une classe template
    Par Opérateur dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2008, 03h26
  3. Réponses: 12
    Dernier message: 29/10/2008, 08h40
  4. Réponses: 22
    Dernier message: 17/07/2008, 09h51
  5. [Template] Surcharge operateur
    Par juls64 dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2007, 19h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo