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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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