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 :

Surcharger l'opérateur <<


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut Surcharger l'opérateur <<
    Bonjour,

    Je cherche à surcharger l'opérateur << pour une de mes classes templates ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    friend ostream& operator << (ostream&, Vecteur<Elem,DIM>&);
    que je définis après dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template <typename Elem, size_t DIM>
    ostream& operator << (ostream& O, Vecteur<Elem,DIM>& P)
    {
        // ...      
    }
    et ce code ne peut pas être incorrecte vu que j'ai été le chercher dans la FAQ et le même code se retrouve dans mon livre de référence.

    Croyez-le où non mais lorsque j'essaye de créer l'executable DevC++ arrive à me trouver deux warnings et et une erreur de linker.

    Que suis-je sensé faire ? Ca ne peut pas être incorrecte. Ca vient tel quel de la FAQ et de mon livre.
    Je vais devenir fou je vous assure

    merci

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Peux-tu donner plus précisément les warnings et l'erreur de linkage que te renvoie le compilateur s'il te plait ?

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut
    Oui, voici :

    Donc je viens de tenter de recompiler et je n'ai plus (pour une raison que personne ne saura sans doute jamais) d'erreur à l'édition de liens.

    Pour les warnings :

    23 [Warning] friend declaration `std::ostream& operator<<(std::ostream&, Vecteur<Elem, DIM>&)' declares a non-template function

    et
    23 (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning

    Je ne comprend pas ce qu'il me veut ...

    merci

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    friend ostream& operator << (ostream&, Vecteur<Elem,DIM>&);

    Est une fonction template, il me semble que tu dois la déclarer comme telle également.
    Ou bien est-ce déjà dans ta classe ?

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut
    Eh bien je ne sais pas, je fais exactement ce qui est écrit dans mon livre de référence et dansla FAQ.
    Je ne vois pas trop quoi faire de plus ...

    De mes deux lignes de code ci dessus la 1er est dans la classe (déclaration).

    merci

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut
    Tiens en revanche si je définis la fonction en dehors de la classe ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    template <typename Elem, size_t DIM>
    ostream& operator << (ostream&, Vecteur<Elem,DIM>&);
     
    template <typename Elem, size_t DIM>
    ostream& operator << (ostream& O, Vecteur<Elem,DIM>& P)
    {
        // ...       
    }
    Cela fonctionne bien.
    Mais je ne comprend toujours pas pourquoi la première façon de faire ne fonctionne pas alors que ça devrait ...

    EDIT : Heu oui mais du coup la fonction en question n'est plus friend avec la classe.
    Donc ça ne fonctionne toujours pas ...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Il suffit de suivre les conseils de ton compilateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    template<typename Elem, size_t DIM> class Vecteur; //forward declaration
    
    template <typename Elem, size_t DIM>
    ostream& operator << (ostream&, const Vecteur<Elem,DIM>&);
    
    template <typename Elem, size_t DIM>
    class Vecteur
    {
      //...
      friend ostream& operator << <>(ostream&, const Vecteur&);
    };
    
    template <typename Elem, size_t DIM>
    ostream& operator << (ostream& O, const Vecteur<Elem,DIM>& P)
    {
        // ...       
    }
    PS: J'ai rajouté quelques const car à priori l'opérateur<< ne devrait pas modifier l'objet qu'on lui passe en paramètre.

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut
    Diable.

    J'avoue que maintenant cela passe sans problème, mais que veux donc dire le signe <> dans la déclaration ?
    Il est indispensable pour éviter les warnings, mais je ne vois pas du tout ce qu'il vient faire la ...

    merci

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Je te renvoie à un message de Jean-Marc Bourguet qui explique le pourquoi du comment de la chose :
    http://www.developpez.net/forums/m1389034-9/

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 58
    Points
    58
    Par défaut
    Je vais aller voir.

    Merci bien pour votre précieuse aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  2. Petit probléme de surcharge d'opérateur .
    Par Clad3 dans le forum C++
    Réponses: 20
    Dernier message: 11/04/2005, 20h15
  3. Problème de surcharge d'opérateurs
    Par Hell dans le forum C++
    Réponses: 17
    Dernier message: 17/01/2005, 16h01
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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