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 :

enum comme clé dans une map


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 45
    Par défaut enum comme clé dans une map
    Bonjour!

    J'ai programmé pas mal en Java et j'essai de retranscrire une application java en C++ (je connais le C++ j'en ai fait longtemps mais j'ai arrété).

    J'ai un problème, je ne sais pas du tout pourquoi.

    J'utilise une enumeration comme clé dans une map et ça ne plait pas au compilateur ^^

    Enfin un exemple vaut mieux qu'un long discours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    #include <map>
     
    enum class Test{
        T1,
        T2
    };
     
    int main ( int argc, char** argv ){
        std::map<Test,float> t_map;
        Test e = Test::T1;
        float s = t_map[e];
    }
    Voici l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_function.h||In member function 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Test]':|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_map.h|449|instantiated from '_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Test, _Tp = float, _Compare = std::less<Test>, _Alloc = std::allocator<std::pair<const Test, float> >]'|
    C:\Users\Cedric\ProgrammesC++\GAME\main.cpp|20|instantiated from here|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\bits\stl_function.h|230|error: invalid operands of types 'const Test' and 'const Test' to binary 'operator<'|
    ||=== Build finished: 1 errors, 1 warnings (0 minutes, 22 seconds) ===|
    Merci beaucoup pour vos réponse

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    avant même de parler de la map, enum class Test ?!?
    Tu crées un enum ou une classe ? décide-toi. Mais cette ligne me parait pour le moins suspect. (pour ne pas dire carrément fausse).

    Ensuite, il faut qu'un opérateur < soit défini pour le type utilisé en clé dans une map.
    Btw, un enum c'est rien de plus que des noms à des entiers, donc déclarer int en clé fera l'affaire.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    enum class Test ?!?
    Bonsoir, c++11 le permet apparemment.

    http://www.cprogramming.com/c++11/c+...num-class.html

    On peut même choisir le type de l'enum.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 45
    Par défaut
    enum class existe.

    Si j'ai fait ça c'est parceque j'ai plusieurs enum dans mon code qui utilisent le meme nom de constante:

    Attr::TEXT et aussi ContentType::TEXT


    Je ne souhaite pas utiliser de int dans ma map mais un type particulier, dans ce cas là une enum car je souhaite pas que l'on puisse rentrer n'importe quoi à l'interieur de la map.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Je ne suis pas au fait des "évolutions" C++11.
    Avoir plusieurs enum du même nom n'a jamais dérangé : namespace et struct permettent de les différencier.

    Je ne suis pas certain que mettre un enum en type de map permettent de s'assurer qu'aucune clé interdite soit utilisée. Il vaudrait mieux pour ça proposer une fonction de check d'insertion.
    L'enum permet uniquement de nommer des valeurs, mais il me semble avoir aperçu une nouveauté du type "enum fortement typé". Peut-être que ça pourrait fonctionner..

    En tous cas l'erreur est toujours la même invalid operands of types 'const Test' and 'const Test' to binary 'operator<', la clé nécessite d'avoir une surcharge de l'opérateur < (cf mon précédent message).
    Peut-on surcharger les oéprateurs pour des enums ?
    edit: apparement oui, donc y'a plus qu'à
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    enum class EST un enum fortement type. En gros c'est un enum qui n'a pas de cast implicit vers les entiers et dont les noms sont dans le scope de l'enum.

    Donc en gros, le code propose devrais marcher, que ce soit un enum ou un enum class.

    Exemple: http://ideone.com/36NKPI
    Ca marche aussi la: http://coliru.stacked-crooked.com/
    Ainsi que la: http://rise4fun.com/vcpp

    Donc en gros ça marche.
    L'erreur que tu montres indique que le type en clé n'a pas d’opérateur <, qui est utilise pour ordonner les différentes valeurs.

    Donc, pour résoudre ton problème. dans l’immédiat, ajoute cette fonction avant de déclarer la map:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        bool operator<( const Test& left, const Test& right )
        { return static_cast<int>(left) < static_cast<int>(right); }
    Mais c'est du bricolage.

    Quelle version de quel compilateur utilises tu?
    EDIT> vu dans le log d'erreur: mingw32\4.4.1

    Ok donc ton problème c'est que tu utilises un très vieux compilateur......

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2012
    Messages : 45
    Par défaut
    Merci pour vos réponse, donc la question serait, où est ce que je peux faire une "mise à jour" d'un compilateur C++? Sachant que j'ai téléchargé la dernière version de CodeBlocks recemment mais ça ne doit pas être suffisant.

Discussions similaires

  1. allocation dans une <map>
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 28/09/2005, 22h30
  2. Destruction dans une map
    Par Clad3 dans le forum C++
    Réponses: 3
    Dernier message: 21/08/2005, 08h45
  3. Réponses: 20
    Dernier message: 22/03/2005, 21h07
  4. Inserer des elements dans une map sans rangement ?
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 07/09/2004, 11h09
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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