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 :

Template & std::map


Sujet :

C++

  1. #1
    Membre tr�s actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : .
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par d�faut Template & std::map
    Bonjour,

    j'essaie de cr�er un template avec un std::map qui ressemblerait � ceci:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    template<typename Type1, typename Type2> void FonctionAutoTest(std::map<std::string, Type1> &Mymap, Type2 valuetest)
    {
    	Data* D_Ptr = new Data();
    	std::map<std::string, Type1>::iterator it = Mymap.begin();
    	Type2 tempvalue;
    }
    Comment puis-je faire ceci?

  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
    Quelle est la question ?
    Le code n'a, � priori, rien de faux. L'as-tu au moins essay� ?
    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 tr�s actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : .
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par d�faut
    Oui sans succ�s, le compilateur m'insulte

    error: need 'typename' before 'std::map<std::basic_string<char>, Type1>::iterator' because 'std::map<std::basic_string<char>, Type1>' is a dependent scope
    error: expected ';' before 'it'
    error: 'it' was not declared in this scope

  4. #4
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    "dependant name" signifie en g�n�ral "tu as oubli� un typename"
    essaye typename std::map<std::string, Type1>::iteratorPar ailleurs
    il faut que Data soit d�fini, et Type2 doit �tre "default constructible", c'est � dire disposer d'un constructeur (explicite ou non) pouvant �tre appel� avec aucun argument.
    Ce programme poss�de tout de m�me deux d�fauts:
    la map n'�tant pas un type compl�tement template, tu ne peux utiliser la fonction avec une map ayant un autre allocateur ou un autre comparateur.

    Pour r�soudre ce probl�me pr�cis, j'ai �cris l'autre jour une fonction operator/ qui permet d'acc�der � un �l�ment d'une map.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename M> 
    typename M::mapped_type const* operator/(M const& map, typename M::key_type const& key) {
       typename M::const_iterator it = map.find(key);
       return (it != map.end()) ? &it->second : NULL;
    }
     
    template <typename M> 
    typename M::mapped_type const* operator/(M const* map, typename M::key_type const& key) {
       return (map!=NULL) ? (*map)/key : NULL;
    }
    Voici un exemple d'utilisation:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef std::map<int, int> resultats_type;
    typedef std::map<std::string, resultats_type> bidules_type;
    bidules_type bidules = {
    { "carres", {{1, 1},  {2, 4},  {3, 9}} }
    { "cubes", {{1, 1},  {2, 8},  {3, 27}} }
    };
    int const * that = bidules/"cubes"/3;
    if(that) std::cout << le cube de 3 est <<*that << std::endl;

  5. #5
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ing�nieur en syst�mes embarqu�s
    Inscrit en
    Juin 2004
    Messages
    1 306
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activit� : Ing�nieur en syst�mes embarqu�s
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par d�faut
    Le compilateur ne t'insulte pas. Le compilateur n'est pas ton ennemi. Le compilateur t'explique. Le compilateur est ton ami, ton coll�gue. Tu lui dois respect et sympathie. Maintenant si tu voulais bien nous donner l'erreur qu'il soul�ve ainsi que la ligne � laquelle celle-ci intervient, peut-�tre pourrions nous te venir en aide. Peut-�tre. Dans le cas contraire, il nous faudra un exemple minimal complet reproduisant l'erreur.

  6. #6
    Membre tr�s actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : .
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par d�faut
    C'est bon �a compile.
    Par contre, je ne comprends pas pourquoi il faut rajout� typename devant "std::map<std::string, Type1>::iterator it = Mymap.begin();"
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    template<typename Type1, typename Type2> void FonctionAutoTest(std::map<std::string, Type1> &Mymap, Type2 valuetest)
    {
    	Data* UD_Ptr = new Data();
    	typename std::map<std::string, Type1>::iterator it = Mymap.begin();
    	Type2 tempvalue;
    }

  7. #7
    Membre tr�s actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : .
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par d�faut
    Merci � vous

  8. #8
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    parce que comme une template peut �tre sp�cialis�e, rien ne dit au compilateur que iterator est bien un nom de type dans une map<..., Type1>, vu que Type1 est un parametre template de l'expression qu'il compile

  9. #9
    Membre tr�s actif
    Homme Profil pro
    .
    Inscrit en
    Octobre 2014
    Messages
    174
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : .
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 174
    Par d�faut
    Citation Envoy� par prgasp77 Voir le message
    Le compilateur ne t'insulte pas. Le compilateur n'est pas ton ennemi.
    Oui tu as raison, je vais offrir une offrande ce soir au saint des saints compilo et sacrifi� trois moutons.

  10. #10
    Expert confirm�

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Software Developer
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par d�faut
    Citation Envoy� par prgasp77 Voir le message
    Le compilateur ne t'insulte pas. Le compilateur n'est pas ton ennemi. Le compilateur t'explique. Le compilateur est ton ami, ton coll�gue. Tu lui doit respect et sympathie. Maintenant si tu voulais bien nous donner l'erreur qu'il soul�ve ainsi que la ligne � laquelle celle-ci intervient, peut-�tre pourrions nous te venir en aide. Peut-�tre. Dans le cas contraire, il nous faudra un exemple minimal complet reproduisant l'erreur.
    Mais si des fois, il pouvait arr�ter de me vomir dessus, ce serait vraiment un super pote!

    EDIT:

    Par rapport � la question, c'est typiquement le genre de cas o� auto est utile.
    Ca te cache la super d�claration typename std::map< truct, bidule >::iterator it = map.begin();, auto it = map.begin() est suffisamment explicite, je trouve.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert � rien, mais qu'il est joli (des fois) : ProceduralGenerator (G�n�ration proc�durale d'images, et post-processing).

  11. #11
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Et tu gagne en souplesse, auto pouvant aussi �tre d�duit en ...::const_iterator.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Probl�me de class template et std::map
    Par bathof dans le forum Langage
    R�ponses: 2
    Dernier message: 31/07/2007, 22h18
  2. Accession aux std::map tri�es ?
    Par Matthieu Brucher dans le forum SL & STL
    R�ponses: 5
    Dernier message: 18/11/2005, 14h44
  3. std::map<int,CStringArray> ????
    Par philippe V dans le forum MFC
    R�ponses: 1
    Dernier message: 12/10/2005, 06h48
  4. Lib�rer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    R�ponses: 2
    Dernier message: 09/07/2005, 14h42
  5. Trier un std::map selon les valeurs plutot que les cl�s
    Par dj.motte dans le forum SL & STL
    R�ponses: 2
    Dernier message: 13/11/2004, 21h54

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