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 :

Problème création d'iterator ( Vector et Map )


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut Problème création d'iterator ( Vector et Map )
    Bonjour,

    Il est rare que je commence de nouveau topic, mais là, je n'en peux plus, il faut que l'on m'explique.

    Je souhaite crée un iterator, pour faire un parcours de mon containeur ( vector ou map , j'ai le problème pour les deux ).
    Des fois, j'y arrive, des fois non. Pourtant je fais toujours la même chose. J'ai quelques idées du pourquoi ça coince, mais faut que quelqu'un m'explique.

    Plus précisément, c'est une erreur avec g++.
    Habituellement je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for ( std::vector<Node<T>* >::iterator it_links = links.begin() ; it_links != links.end() ; ++it_links )
    	delete (*it_links);
    Donc, pour ce qui suive encore :s, je veux un itérator sur mon vector, vector qui contient des pointeurs sur Node ( qui celui ci est un template ).
    Voici comment je déclare mon vector:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<Node<T>*> links;
    Pour avoir plus de précision, pour le morceau qui plante j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::vector<Node<T>* >::iterator it_links;
    for ( it_links = links.begin() ; it_links != links.end() ; ++it_links )
    	delete (*it_links);
    Donc on voit que j'ai juste mis la déclaration de mon pointeur une ligne plus haut.
    g++, me renvoie pour la ligne de la déclaration:
    error: expected `;' before ‘it_links’
    ( Bien sur , pour toute les références it_links suivantes il va dire qu'il ne trouve pas la déclaration ).

    Comme je fais ce morceau de code assez souvent, il semblerai que cela marche des fois.
    Plus précisément, cela doit dépendre du type des éléments dont je construit mon itérateur.
    J'ai l'impression, qu'il n'aime pas les pointeurs sur un template. Mais je voudrais savoir pourquoi et surtout corriger mon problème.

    ( En pièces jointes, je donne le code, que j'utilise pour cette exemple, et aussi le code du même problème sur une map ) ( Code qui est pour Linux ... mais certainement compatible windows ).

    Merci pour toutes vos prochaines suggestions et réponses.
    Fichiers attachés Fichiers attachés
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    A vue d'œil il doit manquer typename. D'ailleurs si tu lit le message d'erreur jusqu'au bout c'est ce que g++ doit dire, je pense.

  3. #3
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    +1 pour le typename.

    En plus de cela pourquoi ne pas utiliser quelque typedef, pour clarifier un peu tout ca?
    Et pourquoi ne pas utiliser un boost::ptr_vector, ou un std::vector de shared_ptr, pour ne plus avoir a faire tout ces delete(et pour être sur qu'ils soit fait)?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Voici les messages d'erreur renvoyés par g++, pour le programme avec les vector
    g++ -Wall -Wextra -pedantic -ansi -c -o src/main.o src/main.cpp
    In file included from src/Node.hpp:24,
    from src/main.cpp:1:
    src/Node.cpp: In destructor ‘Node<T>::~Node()’:
    src/Node.cpp:18: error: expected `;' before ‘it_links’
    src/Node.cpp:19: error: ‘it_links’ was not declared in this scope
    src/Node.cpp:21: error: ‘it_links’ was not declared in this scope
    src/Node.cpp: In member function ‘bool Node<T>::removeLink(Node<T>*)’:
    src/Node.cpp:34: error: expected `;' before ‘linkToRemove’
    src/Node.cpp:35: error: ‘linkToRemove’ was not declared in this scope
    src/Node.cpp:41: error: ‘linkToRemove’ was not declared in this scope
    src/Node.cpp: In member function ‘void Node<T>::displayLinks()’:
    src/Node.cpp:54: error: expected `;' before ‘it_links’
    src/Node.cpp:54: error: ‘it_links’ was not declared in this scope
    make: *** [src/main.o] Error 1
    Il se peux que je ne sache plus lire les messages d'erreurs, mais je ne vois rien qui me parle de typename. De plus en ouvrant les pièces jointes, tu aurait pu voir les magnifiques:
    pour annoncer que je fais une classe template. Ah moins que nous ne parlions pas de la même chose ...

    [EDIT]
    @nogane:
    Il est vrai que des typedefs ne serait pas trop mal ... ( quoique j'aime pas, car après on peut être perdu sur pour lire rapidement le code :s )
    Pour l'histoire du shared_ptr, celui de la stl du moins, je dis pas non, ce n'est pas bête, mais je ne l'ai pas encore fais, car il faut que je me penche sur la doc :s
    [/EDIT]
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Effectivement, les messages ne sont pas très explicites...

    Non je crois qu'on ne parle pas de la même chose. En faite il faudrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename std::vector<Node<T>* >::iterator it_links;
    Je ne me rappel jamais de la règle sur les typename(mais je suis sur que d'autres se feront un plaisir de nous la rappeler), alors ma règle habituel c'est:
    Si j'ai une déclaration avec plein de template dedans, et que mon compilateur me sort des message d'erreurs incompréhensibles... je rajoute typename.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Merci, effectivement un typename à cette place est efficace.
    Je ne connaissais même pas cette écriture :s
    Par contre, si quelqu'un veut bien tester chez lui, j'ai un tas d'erreur de linkage, après avoir rajouter les typename là ou je fais mon itérator. Erreur de linkage que je ne saisi pas, en rapport avec la std::string que je n'utilise pas :s.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    boarpfl ! je n'arrive à reproduire le problème...

    Voici le code que j'ai testé :
    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
    #include <vector>
     
    struct foo_struct
        {
        int bar ;
        } ;
     
    template <class T> struct Node
        {
        T x ;
        };
     
    template <class T> void test ()
        {
        std::vector<Node<T>*> links;
        std::vector<Node<T>* >::iterator it_links;
     
        for ( it_links = links.begin() ; it_links != links.end() ; ++it_links )
    	    delete (*it_links);
        }
     
    void main ()
        {
        test<int>() ;
        test<void*>() ;
        test<std::string>() ;
        test<foo_struct>() ;
        }
    Dis moi quelle différence fondamentale j'ai ratée pour que ça marche...

    Hadrien

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    sopsag : ton exemple compile pas...
    Le compilo ne peut pas savoir que Node<T> dans std::vector<Node<T>* > est un type.

    Avec un typename .... ça marche. (ça compile pas parce que y'a d'autres erreurs).



    ps : main ne peut pas être void.

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par sopsag Voir le message
    Dis moi quelle différence fondamentale j'ai ratée pour que ça marche...
    Le compilateur : les Visual ne disent rien en général sur ce type d'erreur tandis que les g++ gueulent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Node.cpp: In function 'void test()':
    Node.cpp:16: erreur: expected `;' before 'it_links'
    Node.cpp:18: erreur: 'it_links' was not declared in this scope
    Node.cpp: In function 'void test() [with T = int]':
    Node.cpp:24:   instantiated from here
    Node.cpp:16: erreur: dependent-name 'std::vector::iterator' is parsed as a non-type, but instantiation yields a type
    Node.cpp:16: note: say 'typename std::vector::iterator' if a type is meant
    Citation Envoyé par LittleWhite
    Par contre, si quelqu'un veut bien tester chez lui, j'ai un tas d'erreur de linkage
    Un problème avec le linker je pense, il n'est pas spécifié dans le Makefile. En rajoutant "export LD = g++" chez moi ça marche.

  10. #10
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    A noté que ça ne passe pas non plus l'utilisation avec le std::string dans ta structure de test sous gcc. (j'ai pas approfondi).

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

Discussions similaires

  1. Probléme iterator vector
    Par rxjmo dans le forum Langage
    Réponses: 9
    Dernier message: 19/02/2013, 16h11
  2. [PHP 4] Problème création d'une Map pour un jeu
    Par kazylax dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2011, 13h57
  3. [EJB2.1 Entity] [BMP] [Struts] Problème avec <logic:iterate>
    Par romain3395 dans le forum Java EE
    Réponses: 2
    Dernier message: 07/06/2004, 10h12
  4. Problèmes création de procédures et de triggers
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 06/11/2003, 10h42
  5. Problème création de DLL
    Par monsieur.voie.lactee dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/08/2003, 16h56

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