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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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?

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