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.
    Boost ftw

  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').
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  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