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

Langage C++ Discussion :

Syntaxe des template avec G++


Sujet :

Langage C++

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 954
    Points : 221 408
    Points
    221 408
    Billets dans le blog
    130
    Par défaut Syntaxe des template avec G++
    Bonjour,

    J'ai une question liée au template avec G++. Je précise mon compilateur, car avec Microsoft Visual Studio 2008, je n'avais aucun problème pour le même code.
    J'ai simplifié au maximum mon code pour qu'il soit présentable sur le forum. Mais même avec ce code simplifié, le problème existe bel et bien.

    En résumé, je souhaite avec une classe template, qui contient un conteneur STL dont le type spécifié est le type template.
    Voici le code:
    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
    #include <map>
    #include <string>
    #include <iostream>
     
    template <typename T>
    class Foo
    {
        private:
     
            std::map<std::string, T> entries;
     
        public:
     
            void display()
            {
                for ( std::map<std::string, T>::iterator itEntries = entries.begin() ; itEntries != entries.end() ; ++itEntries )
                {
                    std::cout << "Key: " << itEntries->first << " -> " << itEntries->second << std::endl;
                }
            }
     
            void add(const std::string& name, T newValue)
            {
                entries[name] = newValue;
            }
    };
     
    int main()
    {
        Foo<int> myIntMap;
     
        myIntMap.add("Value1",42);
     
        myIntMap.display();
    }
    La commande pour la compilation:
    g++ main.cpp -Wall -Werror -o main
    Les erreurs:
    main.cpp: In member function ‘void Foo<T>::display()’:
    main.cpp:16: error: expected ‘;’ before ‘itEntries’
    main.cpp:16: error: ‘itEntries’ was not declared in this scope
    main.cpp: In member function ‘void Foo<T>::display() [with T = int]’:
    main.cpp:34: instantiated from here
    main.cpp:16: error: dependent-name ‘std::map::iterator’ is parsed as a non-type, but instantiation yields a type
    main.cpp:16: note: say ‘typename std::map::iterator’ if a type is meant
    Bizarrement, la définition de l'itérateur lui semble invisible à cause du T. Si je remplace T par un int, tout va bien, cela compile.
    En ayant lu la dernière phrase de G++, j'ai tenté le code suivant:
    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
    #include <map>
    #include <string>
    #include <iostream>
     
    template <typename T>
    class Foo
    {
        typename std::map<std::string, T>::iterator FooIterator;
     
        private:
     
            std::map<std::string, T> entries;
     
        public:
     
            void display()
            {
                for ( FooIterator itEntries = entries.begin() ; itEntries != entries.end() ; ++itEntries )
                {
                    std::cout << "Key: " << itEntries->first << " -> " << itEntries->second << std::endl;
                }
            }
     
            void add(const std::string& name, T newValue)
            {
                entries[name] = newValue;
            }
    };
     
    int main()
    {
        Foo<int> myIntMap;
     
        myIntMap.add("Value1",42);
     
        myIntMap.display();
    }
    Mais le résultat n'en ai pas meilleur.

    Pouvez vous m'indiquer la syntaxe correcte afin que ce code compile avec G++ (et avec Microsoft Visual Studio 2008), s'il vous plait.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    T'étais pas loin.

    C'est soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     for ( typename std::map<std::string, T>::iterator itEntries = entries.begin() ; 
       itEntries != entries.end() ; 
       ++itEntries ))
       {
          std::cout << "Key: " << itEntries->first << " -> " << itEntries->second << std::endl;
       }
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Foo
    {
       typedef typename std::map<std::string, T>::iterator FooIterator;
     
       private:
     
       std::map<std::string, T> entries;
     
     public:
     
        void display()
       {
          for ( FooIterator itEntries = entries.begin() ; itEntries != entries.end() ; ++itEntries )

  3. #3
    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
    Salut,

    F.A.Q : A quoi sert le mot-clé typename ?

    Visual est très tolérant au typename, source de potentiels oublis.

    Si possible, il faut veiller à compiler avec plusieurs compilateur pour favoriser la conformité du code (même si bien sûr, ce n'est nullement une garantie).

  4. #4
    Membre averti Avatar de ZeRevo
    Inscrit en
    Avril 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 302
    Points : 343
    Points
    343
    Par défaut
    G++ ???

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 954
    Points : 221 408
    Points
    221 408
    Billets dans le blog
    130
    Par défaut
    Merci pour votre aide. Je test ça

    Et je compile avec différent compilo, car mon projet est multiplateforme

    (Note pour ZeRevo: G++ est le fontend de gcc pour compiler le C++, sous GNU/Linux (et autre). Le port Windows s'appelle MinGW si cela vous dit quelque chose)

  6. #6
    Membre averti Avatar de ZeRevo
    Inscrit en
    Avril 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 302
    Points : 343
    Points
    343
    Par défaut
    désolé c'est juste le fait de mettre le G en majuscule qui me faisait marrer

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

Discussions similaires

  1. syntaxe des requète avec plusieurs enregistrements
    Par JeanNoel53 dans le forum Firebird
    Réponses: 2
    Dernier message: 10/01/2012, 17h35
  2. syntaxe des texte avec cote
    Par jeffidf dans le forum Cognos
    Réponses: 2
    Dernier message: 08/06/2009, 16h02
  3. [Smarty] Problème d'affichage des templates avec Smarty
    Par sammaya dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 26/02/2009, 15h11
  4. utilisation des templates avec javaMail
    Par bousnguar dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 12/09/2008, 16h42
  5. Réponses: 7
    Dernier message: 13/02/2007, 16h09

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