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

SL & STL C++ Discussion :

[STL] Erreur lié à l'utilisation d'une liste dans une classe


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut [STL] Erreur lié à l'utilisation d'une liste dans une classe
    J'ai deux classes :
    La premiere est une classe R qui contient un constructeur par default, un par copie, un destructeur, un operateur d'affectation et deux methodes.
    R.h :
    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
    19
    20
    21
    22
     
     #include "message.h"
     
    class R {
     
     public:
      //Constructeur par default
      R();
      //Constructeur par copie
      R(const R &source);
      //Destructeur
      virtual ~R();
      //Operateur d'affectation
      virtual R& operator = (const R &source);
      //Methode de reception d'un message.
      void recevoir_msg(const Message *m);
     
     protected:
      //Methode de traitement d'un message.
      virtual void traiter_msg(const Message *m) = 0;
     
    };
    R.cpp :
    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
     
    #include "R.h"
     
    R::R() {}
     
    R::R(const R &source) {}
     
    R::~R() {}
     
    R& R::operator = (const R &source) { return *this; }
     
    void R::recevoir_msg(const Message *m) {
      //Recevoir un message consiste juste à le traiter
      //et cela quelque soit le receveur. 
      traiter_msg(m);
    }
    La seconde est une classe E qui contient un constructeur par default, un par copie, un destructeur, un operateur d'affectation et trois methodes.
    Elle a comme membre une liste de R* de la STL.
    E.h
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include "message.h"
    #include "R.h"
    #include <list>
     
    class E {
     
     public:
      //Constructeur par default
      E();
      //Constructeur par copie
      E(const E &source);
      //Destructeur
      virtual ~E();
      //Operateur d'affectation
      virtual E& operator = (const E &source);
      //Methode d'ajout d'un recepteur.
      void ajouter_recepteur(const R *recepteur);
      //Methode de suppression d'un recepteur.
      void supprimer_recepteur(const R *recepteur);
      //Methode d'envoi d'un message
      void envoyer_msg(const Message *m) const;
     
     private:
      //Liste des recepteurs
      std::list<R *> L_R;  
     
    };
    E.cpp
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include "E.h"
     
    E::E() {}
     
    E::E(const E &source):L_R(source.L_R) {}
     
    E::~E() {}
     
    E& E::operator = (const E &source) {
      if (this != &source) 
        L_R.assign((source.L_R).begin(),(source.L_R).end());
      return *this;
    }
     
    void E::ajouter_recepteur(const R *recepteur) {
      L_R.push_front(recepteur);
    }
     
    void E::supprimer_recepteur(const R *recepteur) {
      L_R.remove(recepteur);
    }
     
    void E::envoyer_msg(const Message *m) const {
      std::list<R *>::iterator iter;
      for (iter = L_R.begin(); iter != L_R.end(); iter++)
        (*iter)->recevoir_msg(m);
    }
    Un message est une structure.
    message.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Declaration du type Message.
    struct Message {
      int id;
      std::vector<float> tab;
    };
    //***************************
    Avec ce code à la compilation, je me retrouve avec ce message d'erreur :

    E.cpp: In member function «void E::ajouter_recepteur(const R*)»:
    E.cpp:16: erreur: no matching function for call to «std::list<R*, std::allocator<R*> >::push_front(const R*&)»
    /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_list.h:743: note: candidats sont: void std::list<_Tp, _Alloc>::push_front(const _Tp&) [with _Tp = R*, _Alloc = std::allocator<R*>] <près d'une concordance>
    E.cpp: In member function «void E::supprimer_recepteur(const R*)»:
    E.cpp:20: erreur: no matching function for call to «std::list<R*, std::allocator<R*> >::remove(const R*&)»
    /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/list.tcc:174: note: candidats sont: void std::list<_Tp, _Alloc>::remove(const _Tp&) [with _Tp = R*, _Alloc = std::allocator<R*>] <près d'une concordance>
    E.cpp: In member function «void E::envoyer_msg(const Message*) const»:
    E.cpp:25: erreur: no match for «operator=» in «iter = ((const E*)this)->E::L_R. std::list<_Tp, _Alloc>::begin [with _Tp = R*, _Alloc = std::allocator<R*>]()»
    /usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_list.h:112: note: candidats sont: std::_List_iterator<R*>& std::_List_iterator<R*>::operator=(const std::_List_iterator<R*>&)
    make: *** [E.o] Erreur 1
    Est-ce que quelqu'un pourrait m'expliquer l'erreur que j'ai faite ?

    Merci d'avance.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut


    A part ça ta liste contient des R* alors que tu essayes d'y mettre des const R*.

    MAT.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    Merci ca m'a permit de resoudre 2 des 3 problemes.
    On a donc :
    R.h
    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
    19
    20
     
    class R {
     
     public:
      //Constructeur par default
      R();
      //Constructeur par copie
      R(const R &source);
      //Destructeur
      virtual ~R();
      //Operateur d'affectation
      virtual R& operator = (const R &source);
      //Methode de reception d'un message.
      void recevoir_msg(const Message *m) const;
     
     protected:
      //Methode de traitement d'un message.
      virtual void traiter_msg(const Message *m) const = 0;
     
    };
    R.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    R::R() {}
     
    R::R(const R &source) {}
     
    R::~R() {}
     
    R& R::operator = (const R &source) { return *this; }
     
    void R::recevoir_msg(const Message *m) const {
      //Recevoir un message consiste juste à le traiter
      //et cela quelque soit le receveur. 
      traiter_msg(m);
    }
    E.h
    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
    19
    20
    21
    22
    23
    24
     
    class E {
     
     public:
      //Constructeur par default
      E();
      //Constructeur par copie
      E(const E &source);
      //Destructeur
      virtual ~E();
      //Operateur d'affectation
      virtual E& operator = (const E &source);
      //Methode d'ajout d'un recepteur.
      void ajouter_recepteur(const R *recepteur);
      //Methode de suppression d'un recepteur.
      void supprimer_recepteur(const R *recepteur);
      //Methode d'envoi d'un message
      void envoyer_msg(const Message *m) const;
     
     private:
      //Liste des recepteurs
      std::list<R *> L_R;  
     
    };
    E.cpp
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include "E.h"
     
    E::E() {}
     
    E::E(const E &source):L_R(source.L_R) {}
     
    E::~E() {}
     
    E& E::operator = (const E &source) {
      if (this != &source) 
        L_R.assign((source.L_R).begin(),(source.L_R).end());
      return *this;
    }
     
    void E::ajouter_recepteur(const R *recepteur) {
      L_R.push_front((R *)recepteur);
    }
     
    void E::supprimer_recepteur(const R *recepteur) {
      L_R.remove((R *)recepteur);
    }
     
    void E::envoyer_msg(const Message *m) const {
      std::list<R *>::iterator iter = L_R.begin();
      for (; iter != L_R.end(); iter++)
        (*iter)->recevoir_msg(m);
    }
    Le compilateur renvoie cette erreur :
    E.cpp: In member function «void E::envoyer_msg(const Message*) const»:
    E.cpp:24: erreur: conversion from «std::_List_const_iterator<R*>» to non-scalar type «std::_List_iterator<R*>» requested
    make: *** [E.o] Erreur 1
    J'ai besoin d'un eclaircissement.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void E::envoyer_msg(const Message *m) const {
      std::list<R *>::const_iterator iter = L_R.begin();
      for (; iter != L_R.end(); iter++)
        (*iter)->recevoir_msg(m);
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    Merci, ca resout mon probleme completement.
    Neanmoins, j'aimerais connaitre la signification d'un iterateur constant ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    C'est un itérateur qui ne peut pas être utiliser pour modifier l'élément sur lequel il pointe. Il est nécessaire ici car la fonction envoyer_msg est elle-même constante.

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

Discussions similaires

  1. une liste dans une liste?
    Par JerryOne3 dans le forum C#
    Réponses: 11
    Dernier message: 11/01/2009, 16h43
  2. quand je selectionne une valeur dans une liste, retourne une autre valeur
    Par nsqualli dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/12/2008, 14h23
  3. [débutant] Comment gérer une liste dans une liste
    Par Lenoiche dans le forum iReport
    Réponses: 0
    Dernier message: 16/07/2008, 10h41
  4. champ d'une liste lié à une liste dans un autre site
    Par guintolli dans le forum SharePoint
    Réponses: 8
    Dernier message: 08/07/2008, 14h51
  5. Appel d'une liste dans une liste (JSTL)
    Par abalgue dans le forum Hibernate
    Réponses: 4
    Dernier message: 15/06/2007, 10h56

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