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 d'utilisation d'une map


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut Problème d'utilisation d'une map
    Salut à tous,

    je tente vainement d'utiliser une map ainsi :
    Code le .hpp : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<std::string,cStatus> m_status;

    Code le .cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int cElement::AddStatus (std::string name, int nbframes, int visible, int animated, int looping, float x, float y)
    {
        cStatus s(name, nbframes, visible, animated, looping, x, y);
        m_status["test"] = s;
        return m_status.size();
    }

    Et là, il me sort ca à la fin de la compil :
    F:\Projets\mi\element.cpp:: In member function `int cElement::AddStatus(std::string, int, int, int, int, float, float)':
    F:\Projets\mi\element.cpp:28: error: no match for 'operator[]' in '((cElement*)this)->cElement::m_status["test"]'
    C:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\include\c++\3.4.2\bits\stl_map.h:332: note: candidates are: _Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::string, _Tp = cStatus, _Compare = std::less<std::string>, _Alloc = std::allocator<std::pair<const std::string, cStatus> >] <near match>
    :: === Build finished: 2 errors, 0 warnings ===
    Quelqu'un peut-il m'aider ?

  2. #2
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Je soupçonne une déclaration foreward sans inclusion du fichier "map" de std::map.
    Mais si ce n'est pas ça, c'est difficile a dire, peux tu envoyer la totalité du code (le .h et le .cpp), s'il te plait?

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    et en remplacant cela ?
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     m_status[std::string("test")] = s;
    car dans l'erreur
    C:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\include\c++\3.4.2\bits\stl_map.h:332: note: candidates are: _Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = std::string, _Tp = cStatus, _Compare = std::less<std::string>, _Alloc = std::allocator<std::pair<const std::string, cStatus> >]

    Je pense qu'il n'arrive pas a remplacer "test" en const _Key& , vu que Key est une std::string et non un tableau de char

  4. #4
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Eh bien, c'est quasiment la totalité du code...

    ma classe cElement contient la map (private).
    le main crée une instance de cette classe mais n'utilise pas la fonction AddStatus (pas encore, j'étais en train de la coder justement).

    voici le constructeur de la classe cStatus si ca peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cStatus::cStatus (std::string name, int nbframes, int visible, int animated, int looping, float x, float y) :
        m_name(name),
        m_nbframes(nbframes),
        m_visible(visible),
        m_animated(animated),
        m_looping(looping),
        m_x(x),
        m_y(y)
    {
        m_nextframeupdate = 0;
        m_actualframe = 0;
    }
    Rien que de très normal quoi... je pense...

  5. #5
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Mongaulois> Je viens d'essayer, mais même message. Normalement je voudrais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int cElement::AddStatus (std::string name, int nbframes, int visible, int animated, int looping, float x, float y)
    {
        cStatus s(name, nbframes, visible, animated, looping, x, y);
        m_status[name] = s;
        return m_status.size();
    }
    histoire de retrouver mon statut facilement par la suite. mais j'ai strictement la même erreur. J'avais remplacé name par "test" juste pour voir... Désolé du mauvais copier-coller

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bizarre. Par contre tu devrait rajouter l'implémentation de "operator =" pour cStatus.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    juste une question bête.
    tu as bien
    #include <string>

  8. #8
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    J'ai bien l'include, sinon il me planterait avant, dès le hpp...
    Je vais voir un construteur de recopie par le = en effet...

  9. #9
    screetch
    Invité(e)
    Par défaut
    peux tu envoyer le .h et le .cpp complet ?

    n'as tu pas inclus string ou map a l'interieur d'un namespace a toi ou un truc du genre ?

  10. #10
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Merci MonGauois !
    Un operator semble être la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cStatus& cStatus::operator = (cStatus& s)
    {
        cStatus st(s.m_name,s.m_nbframes,s.m_visible,s.m_animated,s.m_looping,s.m_x,s.m_y);
        return (st);
    }
    La seule chose c'est qu'il me fait un warning comme quoi je retourne la référence de st... ?

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Mindiell Voir le message
    Merci MonGauois !
    Un operator semble être la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cStatus& cStatus::operator = (cStatus& s)
    {
        cStatus st(s.m_name,s.m_nbframes,s.m_visible,s.m_animated,s.m_looping,s.m_x,s.m_y);
        return (st);
    }
    La seule chose c'est qu'il me fait un warning comme quoi je retourne la référence de st... ?
    Dans ton code st est créé au debut de ta fonction puis détruite aprés le return. Donc retourné une reference sur un objet détruit c'est soit ca passe parce que t'as pris un café sous une lune verte et que t'as de la change, soit ça fera un segmentation fault (ou un truc comme ca)
    ton "operator =" devrait plustôt ressemblé a :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cStatus& cStatus::operator = (const cStatus& s)
    {
    m_name = s.m_name;
    m_nbframes = s.m_nbframes;
    m_visible = s.m_visible;
    m_animated = s.m_animated;
    m_looping = s.m_looping;
    m_x = s.m_x;
    m_y = s.m_y;
    return (*this);
    }

  12. #12
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Pour la surcharge de l'operateur = le mieux est encore d'utiliser cette technique qui permet d'éviter l'auto-affectaion et autres pièges.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Sauf que là c'est inutile, la classe ne gère aucune ressource. D'ailleurs cet opérateur d'affectation est lui-même inutile, celui généré par défaut sera exactement identique. J'ai du mal à croire que le fait de le définir explicitement change quelque chose au problème

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    D'ailleurs cet opérateur d'affectation est lui-même inutile, celui généré par défaut sera exactement identique.
    tu est sur? vu que name est une std::string

    Citation Envoyé par Laurent Gomila Voir le message
    J'ai du mal à croire que le fait de le définir explicitement change quelque chose au problème
    J'avais déjà eu des problèmes similaire... mais cela dépendais du compilot...

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    tu est sur? vu que name est une std::string
    Du moment que std::string possède un opérateur = ce qui est évidemment le cas), ça ne pose pas de problème puisque c'est ce que le compilo appelle pour chaque membre.

  16. #16
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Bon,
    je vérifierais ca ce soir tranquillement. Au bureau, c'est pas pratique
    Merci pour vos posts très intéressants...

  17. #17
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    En effet !
    Sans ces maudits constructeurs de copie et autres opérateur, ca passe
    En fait, il semble qu'il n'est pas prévu d'avoir des membres const dans une classe

    Et j'en avais mis beaucoup, un peu n'importe comment... J'ai tout retiré, ca passe sans problème ! Je vais donc conserver les const pour les retours de valeur à travers ma classe et c'est tout

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Un membre constant empêche ta classe d'avoir un opérateur d'affectation, ce qui la rend incompatible avec les conteneurs standards.

  19. #19
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Oui, j'ai bien compris maintenant
    Je laisse donc seulement certaine fonctions en const et je n'en mets plus partout, merci !

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

Discussions similaires

  1. Problème d'utilisation d'une dll
    Par Zocco dans le forum C++Builder
    Réponses: 1
    Dernier message: 08/11/2007, 17h42
  2. problème avec insert dans une map
    Par LePetitBricoleur dans le forum C++
    Réponses: 3
    Dernier message: 01/11/2007, 11h52
  3. Problème d'utilisation d'une application
    Par ROYER dans le forum Bases de données
    Réponses: 6
    Dernier message: 06/09/2007, 12h07
  4. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  5. Réponses: 5
    Dernier message: 26/05/2005, 15h40

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