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 :

itérateur sur un vecteur de structures


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 27
    Par défaut itérateur sur un vecteur de structures
    bonjour, j'ai un problème avec un l'iterator d'un vecteur de structures..

    en fait, voila le bout de code concerné

    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
     
    class xslot { 
     
    var.....
     
    struct SlotConnect{
      xslot* slot;
      int    NBConnect;
    };
     
    public:
     
    typedef vector<SlotConnect>                           SlotConnect;
    typedef vector<SlotConnect>::iterator                 SlotConnect_it;    
    typedef vector<SlotConnect>::const_iterator           const_SlotConnect_it; 
     
     
    bla bla bla...
     
     
    SlotConnect_it   SlotConnect_begin()    { return _SlotConnect.begin(); }
    const_SlotConnect_it    SlotConnect_begin()   const   { return _SlotConnect.begin(); }
    SlotConnect_it     SlotConnect_end()    { return _SlotConnect.end(); }
    const_SlotConnect_it     SlotConnect_end()   const   { return _SlotConnect.end(); }
     
     
     
      };

    lorsque je compile mon code, j'obtient l'erreur suivante..




    In member function ‘xslot::const_SlotConnect_it xslot::SlotConnect_begin() const’:
    xslot.h:77: error: conversion from ‘__gnu_cxx::__normal_iterator<const xslot::SlotConnect*, std::vector<xslot::SlotConnect, std::allocator<xslot::SlotConnect> > >’ to non-scalar type ‘xslot::const_SlotConnect_it’ requested

    sachant que cette erreur se répète pour les 4 methodes definies..
    et sachant encore que mon code contient d'autres itérateurs pour des des vecteurs d'élements simples(pas de struct), et y a pas de problème avec ces itérateurs, sauf avec celui qui parcoure le vecteur de structures..


    est ce que quelqu'un a une idée sur l'origine de cette erreur??

    merci

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Quel est le type de _SlotConnect dans ton code ?

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Normalement, ton compilateur devrait t'indiquer dans quel contexte tu cette erreur survient (sans doute par un "requested by..." )

    Il semblerait que, pour une raison ou une autre, tu essayes d'accéder à un itérateur non constant depuis une fonction constante, ce qui pourrait provoquer l'erreur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    est-ce bien le code de la classe ou une erreur de recopie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef vector<SlotConnect> SlotConnect;
    Car sinon SlotConnect est redéfini et les lignes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef vector<SlotConnect>::iterator                 SlotConnect_it;    
    typedef vector<SlotConnect>::const_iterator           const_SlotConnect_it;
    vont définir des iterateurs sur des vecteurs de vecteurs de struct SlotConnect (vector<vector<struct SlotConnect>>::iterator).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 27
    Par défaut
    je vous remercie tous pour vos réponses..
    effectivement, j'ai utilisé le même nom pour la structure et le vecteur...
    une erreur impardonnable...

    maintenant, ça marche..

    merci encore une fois

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    En complément, comme tu utilises gcc, tu peux utiliser le mot clé auto pour laisser le compilateur déterminer automatiquement le type, ce qui peut être utile dans certain cas.

    Pour activer le C++11, il faut ajouter l'option -std=c++11 pour gcc >= 4.7 et -std=c++0x pour gcc >= 4.4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    auto SlotConnect_begin() ->decltype(_SlotConnect.begin()) { return _SlotConnect.begin(); }
    
    auto SlotConnect_end() ->decltype(_SlotConnect.end()) { return _SlotConnect.end(); }
    Et pour utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xslot x;
    auto b = x.SlotConnect_begin();
    auto e = x.SlotConnect_end();
    Pour les typedef, tu peux utiliser un typedef que tu as définit toi même pour créer d'autres typedef, ça facilite les modifications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef vector<SlotConnect> SlotConnectVector;
    typedef SlotConnectVector::iterator SlotConnect_it;
    typedef SlotConnectVector::const_iterator const_SlotConnect_it;

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Tiens, étrangement, j'ai du mal avec le constness et decltype...
    Si on déclare les fonctions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    auto begin() ->decltype(v.begin()) { return v.begin(); }
    auto begin() const ->decltype(v.cbegin()) { return v.cbegin(); }
    auto cbegin() const ->decltype(v.cbegin()) { return v.cbegin(); }
    Alors les types utilisés par auto sont les suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    auto i1 = x.begin(); // iterator
    const auto i2 = x.begin(); // iterator :aie:
    const auto i3 = x.cbegin(); // const_iterator
    const auto i4 = x.cbegin(); // const_iterator
    Bref, cela oblige à créer et appeler directement un fonction const (cbegin ici), sinon le compilateur utilise la version non const de begin. Il y a un moyen de forcer l'utilisation de begin const ?

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

Discussions similaires

  1. vecteur de structure
    Par dimahoo dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2006, 04h37
  2. [Struts] Problème pour itérer sur un vecteur
    Par vallica dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/04/2006, 15h45
  3. Réponses: 7
    Dernier message: 18/04/2006, 17h44
  4. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40

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