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 :

Probleme avec std::map


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut Probleme avec std::map
    Bonjour,

    je ne comprends pas pourquoi avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	struct Test
    	{
    		int _a;
    		int _b;
    		Test(int a, int b) : _a(a), _b(b) {}
    	};
     
    	Test T(1, 2);
    	std::map<int, Test> M;
    	M[0] = T;
    j'ai l'erreur :
    error C2512: 'Test::Test' : no appropriate default constructor available
    d:\program files\microsoft visual studio\vc98\include\map(93) : while compiling class-template member function 'struct Test &__thiscall std::map<int,struct Test,struct std::less<int>,class std::allocator<struct Test> >::operator [](const int
    Alors que si je redéfinis mon constructeur de struct ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	struct Test
    	{
    		int _a;
    		int _b;
    		Test(int a=0, int b=0) : _a(a), _b(b) {}
    	};
    Je n'ai plus de problème.

    Pourquoi faut-il absolument un constructeur par défaut ?

    Merci par avance.

  2. #2
    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
    Par défaut
    L'appel à l'opérateur [] de std::map construit un objet par défaut, puis renvoie celui-ci par référence ; c'est pour ça qu'il te demande un constructeur par défaut. Ceci-dit tu n'est pas obligé d'en fournir un, si tu insères ton objet autrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    M.insert(std::make_pair(0, T));

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    OK, alors il vaudrait peut être mieux que j'utilise map::insert ...
    Le seul truc qui m'embete c'est que j'aurais voulu l'insérer même s'il existait déjà.

    Merci beaucoup
    @+

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    pour olive:
    j'essaye de comprendre:
    Test(int a=0, int b=0) : _a(a), _b(b) {}

    que signifient : _a(a) ou _(b) ?

  5. #5
    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
    Par défaut
    que signifient : _a(a) ou _(b) ?
    C'est la liste d'initialisation, voir la FAQ pour plus de détails.

    Le seul truc qui m'embete c'est que j'aurais voulu l'insérer même s'il existait déjà.
    Dans ce cas, si la classe réelle le permet, définis un constructeur par défaut.
    Sinon il faudra insérer de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::map<int, Test>::iterator It = M.find(0);
     
    if (It != M.end())
    {
        // Clé déjà présente : on réaffecte
        It->second = T;
    }
    else
    {
        // Clé inexistante : on insère
        M.insert(std::make_pair(0, T));
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Salut,

    En supposant que je définisse un constructeur par défaut.
    Si l'opérateur [] de map crée un objet par défaut, alors il va falloir aussi qu'il l'affecte avec celui passé en paramètre, et donc il faudrait aussi pour + de propreté définir le constructeur de copie et l'opérateur d'affectation, non ?

    @+

  7. #7
    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
    Par défaut
    et donc il faudrait aussi pour + de propreté définir le constructeur de copie et l'opérateur d'affectation, non ?
    Bien sûr
    Ici ceux générés par défaut sont corrects, mais si tu as une classe plus compliquée (genre qui gère une ressource brute) alors il faut définir tout ça.

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

Discussions similaires

  1. probleme avec std::map
    Par devdeb91 dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2013, 23h52
  2. probleme avec les maps
    Par teramp3 dans le forum SL & STL
    Réponses: 3
    Dernier message: 31/03/2008, 11h01
  3. Probleme avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/03/2007, 16h51
  4. probleme avec le mapping d'association avec hibernate
    Par senediene dans le forum Hibernate
    Réponses: 2
    Dernier message: 10/08/2006, 13h59
  5. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56

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