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 :

soucis const_iterator/iterator sans raison apparente


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Points : 69
    Points
    69
    Par défaut soucis const_iterator/iterator sans raison apparente
    Bonjour,

    J'ai une série de classe représentant in fine, chacun, une liste de la classe précédente (parce que l'héritage fait n'imp)
    Pour illustrer :
    class A{};
    class B{list<A> listAname};
    class C{list<B> listBname};

    donc c'est pas sorcier. J'ai fait les 4 opérateurs de base (constructeur, destructeur, recopie, =) comme il faut pour A et B et pour ceux de C...un "petit" soucis lors de la compilation. Je n'arrive pas à comprendre le message d'erreur reçu ou ce qu'il indique.


    Le message est le suivant :
    avec class B:=GLignage et class C:=GPattern

    C:/INFORMATIQUE/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/list.tcc:129: error: no match for 'operator=' in '(&(&__first1)->std::_List_iterator<_Tp>::operator++ [with _Tp = GLignage](0))->std::_List_iterator<_Tp>::operator* [with _Tp = GLignage]() = (&(&__first2)->std::_List_const_iterator<_Tp>::operator++ [with _Tp = GLignage](0))->std::_List_const_iterator<_Tp>::operator* [with _Tp = GLignage]()'
    mingw32-make[1]: Leaving directory `C:/INFORMATIQUE/eclipse/WorkFILE/Geo_Morph'
    src\Data\GPattern\/GLignage.h:42: note: candidates are: GLignage& GLignage::operator=(GLignage&)
    mingw32-make[1]: *** [release\GKompac.o] Error 1
    les 4 op de GLignage sont :
    avec lignage=listAname (même si c'est un vector en fait ^_^...ça doit pas changer grand chose, si?)
    GSegment la classe en dessous de A... (2 int simplement)

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     //_____Constructeur par defaut_____//
     GLignage::GLignage() 
       {
        transseg=GSegment(0,0);
        lignage.push_back(transseg);
       }
     
    //_____Constructeur_____//   
     GLignage::GLignage(GSegment& seg, vector<GSegment>& vect)
       {
        if(seg.longueur()+1!=(int)vect.size())
          {
           transseg=GSegment(0,0);
           lignage.push_back(transseg);
          }
        else
          {
           transseg=seg;
           lignage=vect;
          }
     
       }
     
     //_____Constructeur simple_____//   
     GLignage::GLignage(GSegment& seg, int position)
        {
         transseg=GSegment(position,position);
         lignage.push_back(seg);
        }
     
    //_____Destructeur_____//
     GLignage::~GLignage() 
       {
     
       }
     
    //_____Constructeur de recopie_____//   
     GLignage::GLignage(const GLignage& glig)
       {
        if(&glig!=this)
          {
           transseg=glig.transseg;
           lignage=glig.lignage;
          }    
       }
     
    //_____Operateur d'affectation_____//   
     GLignage& GLignage::operator=(GLignage& glig) 
       {
        if(&glig!=this)
          {
           transseg=glig.transseg;
           lignage=glig.lignage;
          }
        return *this;
       }
    et pour la classe C :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    //_____Constructeur_____//
     GKompac::GKompac() //par défaut, vide
      {
       GLignage glig;
       LightPtr.push_back(glig);	 
      }
     
    //_____Constructeur utile_____//
     GKompac::GKompac(GLignage& gg)
       {
        LightPtr.push_back(gg);	 
       }
     
    //_____Destructeur_____//
     GKompac::~GKompac() 
       {}
     
    //_____Constructeur de recopie_____//   
     GKompac::GKompac(const GKompac& gpat)
       {
        if(&gpat!=this)
          {
        	//todo//LightPtr=gpat.LightPtr; //mais provoque le message d'erreur (si activé!)
     
          }    
       }
     
    //_____Operateur d'affectation_____//   
     GKompac& GKompac::operator=(GKompac& gpat)
       {
        if(&gpat!=this)
          {
           LightPtr=gpat.LightPtr; //qui provoque le message d'erreur (si activé!)
          }    
        return *this;
       }
    si je regarde bien le message, il semble qu'il y ait conflit entre const_iterator et iterator... quelqu'un pourrait-il me dire d'où ça peut venir?
    Merci bcp!

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    dans
    GKompac::GKompac(const GKompac& gpat)
    tu utilise
    GLignage& GLignage::operator=(GLignage& glig)
    donc oui il y as conflit de const-correct.
    l'operateur = doit prend une reference const ou une copie

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ton code n'est pas const-correct du tout de toutes façons.
    Si tu ne modifies pas une variable que tu prends par référence, prends-la par const-reference.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Points : 69
    Points
    69
    Par défaut
    donc si je vous suis bien...je dois mettre const dans l'argument des operator=. C'est bien ça?

    J'suis preneur de conseil si mon code est "const-incorrect"!

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Oui... sinon tu ne pourras jamais affecter une valeur de retour d'une fonction (les variable "temporaires" sont 'const').

  6. #6
    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
    Citation Envoyé par DEVfan Voir le message
    J'suis preneur de conseil si mon code est "const-incorrect"!
    Assez simplement:
    -> si ta méthode ne modifie pas l'état de this, alors elle doit être const.
    -> si tu passe par référence ou par pointeur, un paramètre qui n'est pas modifié, alors il doit être const.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Points : 69
    Points
    69
    Par défaut
    c'est sûr que ça parait logique dit comme ça!

    ben merci, je vais faire qq modif (ça devrait marcher donc!)

Discussions similaires

  1. [D7] [Paradox] Application fermée par XP pro SP2 sans raison apparente
    Par plante20100 dans le forum Bases de données
    Réponses: 9
    Dernier message: 13/09/2007, 12h06
  2. Réponses: 1
    Dernier message: 26/07/2007, 16h30
  3. [Access 2000] Plantages sans raisons apparentes
    Par 973thom dans le forum Access
    Réponses: 2
    Dernier message: 09/07/2007, 10h04
  4. Réponses: 2
    Dernier message: 17/01/2007, 19h23
  5. Page s'exécutant sans raison apparente
    Par j_bolduc dans le forum ASP
    Réponses: 4
    Dernier message: 23/02/2006, 15h33

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