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

Boost C++ Discussion :

[BOOST_FOREACH] ne marche pas


Sujet :

Boost C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut [BOOST_FOREACH] ne marche pas
    slt à toute la communauté,
    beh voilà j'ai un problème pas très simple. Dans le cadre d'un project j'ai écris une classe défini à peu près comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Scan
    {
      private:
         std::vector< LaserRowSet > pointList; //!< stores all the points
         unsigned int pointCount; //!< buffers the number of points
         bool pointMemoryResponsability; 
      public:
         Scan(TimeIndex t);
         void add(Point *point, unsigned int laserRow=0, float yaw=0);
    }
    j'ai aussi défini une classe iterator pour itérer sur mes éléments avec les fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    iterator begin();  //!< get Iterator that points to the first Point, i.e. the first Point in the first laser row
    iterator end();
    .

    Je peux donc ajouter des points dans ma classe en faisant tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Scan s1(0);
    Point p1(2,2,2);
    s1.add(&p1, 5);
    Maintenant je veux afficher tous les points contenus dans mon objet scan, pour cela je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Scan::iterator s1it = s1.begin();
    for (s1it = s1.begin(); s1it != s1.end(); s1it++){
    	Point *pt = *s1it;
    	cout << "Point:" << *pt;
    	ptCount++;
    }
    ca marche à merveille. Le problème est, je veux en fait utiliser boost_foreach, mais ca na marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BOOST_FOREACH(Point* pt, s1){
        cout << "Point:" << *pt;
       }
    Je n'ai vraiment pas grande idée où sa coince. Quelqu'un m'a parlé d'iterator adaptator mais je n'ai aucune idée de comment on l'utilise.
    Je travaille avec Eclipse sous linux et voilà l'érreur que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Scan.cpp:201:   instantiated from here
    /usr/include/boost/range/const_iterator.hpp:36: error: no type named ‘const_iterator’ in ‘class Scan’
    /usr/include/boost/foreach.hpp: In function ‘typename boost::foreach_detail_::foreach_reference<T, C>::type boost::foreach_detail_::deref(const boost::foreach_detail_::auto_any_base&, boost::foreach_detail_::type2type<T, C>*) [with T = Scan, C = mpl_::bool_<false>]’:
    Scan.cpp:201:   instantiated from here
    /usr/include/boost/foreach.hpp:636: error: invalid initialization of non-const reference of type ‘Point*&’ from a temporary of type ‘Point*’
    make[1]: Leaving directory `/home/simo/code/DataContainers3D'
    make[1]: *** [debug/Scan.o] Error 1
    make: *** [debug] Error 2
    J'attends impatienment vos suggestions et merci d'avance.
    PS: désolé des quelques fautes, j'écris avec clavier allemand.

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Salut!
    Le mot clé ici c'est type.
    error: no type named ‘const_iterator’ in ‘class Scan’
    Et dans la doc de boost :
    The support for STL containers is very general; anything that looks like an STL container counts. If it has nested iterator and const_iterator types and begin() and end() member functions, BOOST_FOREACH will automatically know how to iterate over it
    Il faut donc que ta classe suive ce synopsis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Scan
    {
    public:
    typedef "..." iterator;
    typedef "..." const_iterator;
    iterator begin();
    iterator end();
    const_iterator begin() const;
    const_iterator end() const;
    ...
    }

  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
    Par défaut
    En fait, il faut que le type satisfasse les pré-requis de Range.
    Tu regardes le concept et tu vérifies que tu l'implémentes correctement...

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    Merci pour vos réponses et excusez-moi de la réponse tardive. C'étais bel et biedn ca le problème. Mais bon je vais essayer de trouver une alternative car j'ai pas vraiment envie de reécrire ma Klasse iterator et la nommer const_iterator, pour moi ca ferai de la duplication de code. Je jette un coup d'oeil sur les iterators facades, il parait que ca peut resoudre aussi mon problème.

    Merci

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu ajoutes un typedef, ça peut être pas mal (typedef iterator<boost::add_const<CetteClasse>::type> const_iterator ou un truc du genre).

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    quel effet à cet typdef iterator...?, apparenment elle crée un const_iterator à partir de ma classe itérator...?, quelle est la valeur de type?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Il te fat un type const_iterator qui soit un itérateur sur le conteneur constant. D'où le fait de faire un typedef pour le créer sans réécrire le code.

  8. #8
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    donc en fait ma classe iterator{..} (c'est comme ca que j'ai nommé ma classe) doit etre un template d'après cette écriture?

    doit ajouter un include<boost...>? ou un truc semblable afin que ca marche?

    Merci

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par arthurembo Voir le message
    donc en fait ma classe iterator{..} (c'est comme ca que j'ai nommé ma classe) doit etre un template d'après cette écriture?

    doit ajouter un include<boost...>? ou un truc semblable afin que ca marche?

    Merci
    Oui et oui (regarde dans la doc de MPL pour Boost).

  10. #10
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575

  11. #11
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    ok,
    j'ai écris comme cela chez moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    boost::add_const<iterator>::type const_iterator;
    const_iterator begin();
    Bon beh j'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ‘const_iterator’ does not name a type
    La première approche (typedef iterator<boost::add_const<iterator>::type> const_iterator) était une bonne approche, mais en fait pour cela il faudrait que ma classe iterator soit un template, ce dont je ne veux pas.

    En fait je veux utiliser le BOOST_FOREACH pour itérer sur ma classe mais le problème effectivement est que je dois d'une manière définir un const_iterator mais je n'ai pas envie de réecrire une classe const_iterator du moment où il possède les mêmes fonctions que la classe iterator. Quelqu'un aurait il une meilleure solution?

    Merci

  12. #12
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Dans ce cas, ta classe iterator doit mettre à disposition une version const par le biais d'un typedef, que tu pourras utiliser de l'extérieur.

  13. #13
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    beh,
    comment le faire concrètement?. C'est en fait ca mon problème. Désolé des questions mais je suis novice dans la STL et BOOST.

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Utilise typedef.

Discussions similaires

  1. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 09h28
  2. Maximiser fenêtre ne marche pas
    Par sandrinec dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/06/2003, 12h02
  3. Réponses: 9
    Dernier message: 07/05/2003, 12h57
  4. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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