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 153
    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 153
    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 153
    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 153
    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. 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