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 :

map dans un header


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut map dans un header
    bonsoir à tous,

    je suis un vrai débutant en c++ et j'ai un problème dans un header qui contient un map:

    mon .h:

    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
     
    #ifndef DEF_TOTO
    #define DEF_TOTO
    class Toto
    {
    	public:
     
    	Toto();
     
    	private:
     
    	std::string name;
    	std::map<int,int> dict;
    };
     
    #endif
    mon .cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <map>
    #include <string>
    #include "toto.h"
     
    Toto::Toto()
    {
    	std::string name="hello";
    	std::map<int,int> dict;
    }
    mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include "toto.h"
     
    int main()
    {
    	Toto toto;
    	return 0;
    }
    à la compilation j'ai un message d'erreur sur mon .h qui me dit

    'map' : is not a member of 'std'
    Lorsque je commente les lignes en relation avec le map dans le .h et dans le .cpp ça compile et je ne comprends pas pourquoi il trouve string dans std alors qu'il ne trouve pas map.

    Je me dis que je fais forcément quelque chose de travers mais je ne vois pas vraiment quoi...

    Merci pour votre aide.

  2. #2
    Membre éprouvé Avatar de BoudBoulMan
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Par défaut
    Lorsque le compilateur compile le main.cpp, et inclue donc toto.h, il n'y a aucune référence à l'entête map et ne sait donc pas où chercher.
    Tu peux ajouter #include <map> dans le main.cpp

    mais ce que je te conseille c'est de la faire dans le .h et non dans le .cpp, tu n'auras pas à le répéter.

    edit: ensuite en ce qui concerne la reconnaissance de la classe string, c'est que l'entête doit vraisemblablement être inclue depuis le fichier iostream

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    merci.

    effectivement en rajoutant un include <map> dans le main ou dans le .h ça fonctionne

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Petit remarque sur le code :

    Le map dict est défini deux fois : une fois comme membre de la classe toto, une fois comme variable locale du constructeur de la classe toto...

    Pareil pour le membre name.

    pour toto.cpp, le code suivant suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <map>
    #include <string>
    #include "toto.h"
     
    Toto::Toto()
    {
        name="hello";
    }

  5. #5
    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
    Par défaut
    Citation Envoyé par mabu Voir le message
    pour toto.cpp, le code suivant suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <map>
    #include <string>
    #include "toto.h"
     
    Toto::Toto()
    {
        name="hello";
    }
    ou mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Toto::Toto() : name("hello")
    {
    }
    FAQ initialisation dans un constructeur

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    merci pour vos remarques

    je trouvais ça bizarre en effet de le déclarer à deux endroits, j'ai introduit ces modifications.

    mon petit doigt me dit que c'est pas la dernière fois que je viens vous embêter

  7. #7
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Citation Envoyé par BoudBoulMan Voir le message
    edit: ensuite en ce qui concerne la reconnaissance de la classe string, c'est que l'entête doit vraisemblablement être inclue depuis le fichier iostream
    Je ne sais pas comment c'est fait, mais il doit y avoir une partie de la classe déclarée dans <iostream>. A l'origine je n'utilisais que <iostream>, je pensais que <string> faisait référence à <string.h> du C. En fait non, les fonctions avancées de std::string sont dans <string>.

    D'ailleurs, si tu inclus <iostream> sans <string>, tu peux déclarer une std::string, mais tu ne peux pas l'utiliser directement avec les flux de sortie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <iostream>
    int main()
    {
        std::string s("Hello");
        std::cout << s.str() << std::endl;
        return 0;
    }
    Alors que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <iostream>
    #include <string>
    int main()
    {
        std::string s("Hello");
        std::cout << s << std::endl;
        return 0;
    }

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Quelle entête standard inclue quel autre est au bon vouloir de l'implémentation. Si tu veux utiliser des strings, tu es sensé inclure <string> toi même, sans rien espérer de la part de ta version de la bibliothèque.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <vector>
    int main()
    {
    	std::string s("Hello");
    	std::vector<std::string> vs;
    	vs.push_back(s);
    	return 0;
    }
    Bah ma fois, ça compile. Curieux ... A croire string est vraiment considéré comme étant indispensable. Spécifique à VC++ ou g++ est pareil ?

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Noxen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <vector>
    int main()
    {
    	std::string s("Hello");
    	std::vector<std::string> vs;
    	vs.push_back(s);
    	return 0;
    }
    Bah ma fois, ça compile. Curieux ... A croire string est vraiment considéré comme étant indispensable. Spécifique à VC++ ou g++ est pareil ?
    g++ est pas d'accord :
    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
    08-08-09.c:4: error: variable 'std::string s' has initializer but incomplete type
    08-08-09.c:6: error: no matching function for call to 'std::vector<std::string, std::allocator<std::string> >::push_back(<type error>)'
    /usr/include/c++/4.0.0/bits/stl_vector.h:602: note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = std::string, _Alloc = std::allocator<std::string>]
    /usr/include/c++/4.0.0/bits/stl_vector.h: In destructor 'std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = std::string, _Alloc = std::allocator<std::string>]':
    /usr/include/c++/4.0.0/bits/stl_vector.h:189:   instantiated from 'std::vector<_Tp, _Alloc>::vector(const typename std::_Vector_base<_Tp, _Alloc>::allocator_type&) [with _Tp = std::string, _Alloc = std::allocator<std::string>]'
    08-08-09.c:5:   instantiated from here
    /usr/include/c++/4.0.0/bits/stl_vector.h:109: error: invalid use of undefined type 'struct std::string'
    /usr/include/c++/4.0.0/bits/stringfwd.h:56: error: declaration of 'struct std::string'
    /usr/include/c++/4.0.0/bits/stl_construct.h: In function 'void std::_Destroy(_ForwardIterator, _ForwardIterator, _Allocator) [with _ForwardIterator = std::string*, _Allocator = std::allocator<std::string>]':
    /usr/include/c++/4.0.0/bits/stl_vector.h:273:   instantiated from 'std::vector<_Tp, _Alloc>::~vector() [with _Tp = std::string, _Alloc = std::allocator<std::string>]'
    08-08-09.c:5:   instantiated from here
    /usr/include/c++/4.0.0/bits/stl_construct.h:173: error: cannot increment a pointer to incomplete type 'std::string'
    /usr/include/c++/4.0.0/ext/new_allocator.h: In member function 'void __gnu_cxx::new_allocator<_Tp>::destroy(_Tp*) [with _Tp = std::string]':
    /usr/include/c++/4.0.0/bits/stl_construct.h:174:   instantiated from 'void std::_Destroy(_ForwardIterator, _ForwardIterator, _Allocator) [with _ForwardIterator = std::string*, _Allocator = std::allocator<std::string>]'
    /usr/include/c++/4.0.0/bits/stl_vector.h:273:   instantiated from 'std::vector<_Tp, _Alloc>::~vector() [with _Tp = std::string, _Alloc = std::allocator<std::string>]'
    08-08-09.c:5:   instantiated from here
    /usr/include/c++/4.0.0/ext/new_allocator.h:107: error: invalid use of undefined type 'struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >'
    /usr/include/c++/4.0.0/bits/stringfwd.h:56: error: declaration of 'struct std::basic_string<char, std::char_traits<char>, std::allocator<char> >'
    Si on inclut <string> la compilation ne pose pas de problème.

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

Discussions similaires

  1. map dans un header
    Par lguignar dans le forum SL & STL
    Réponses: 13
    Dernier message: 24/04/2008, 14h59
  2. [TListView] Ajouter un icône de tri dans le header
    Par phplive dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/09/2005, 13h07
  3. [Mail] Subject dans le header
    Par Tchinkatchuk dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2005, 09h24
  4. Réponses: 6
    Dernier message: 30/04/2004, 15h53
  5. [MFC] image dans un header de CListCtrl
    Par tut dans le forum MFC
    Réponses: 3
    Dernier message: 11/06/2003, 15h26

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