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

Langage C++ Discussion :

manipulation de template dans une map


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut manipulation de template dans une map
    Bonjour,

    j'ai un problème quand j'essaie de déclarer une map, ou même un iterator sur ce type de map, etc... ça me ramène des erreurs incompréhensibles (pour moi) et ça m'ouvre des fichiers comme stl_tree.h, stl_map.h...

    voici la classe qui pose problème :
    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
    19
    20
    21
    22
    23
    24
    template<typename T>
    class State
    {
      public :
        State(const std::string& name_, const std::map< Transition<T>&, State<T>& > transitionList_, const T_type& type_=intermediaire);
        ~State();
     
     
        const std::string& GetName() const;
        std::string& GetName();
        void SetName(const std::string& name_);
     
        const Transition<T>& GetTransitionByName(const std::string& name_) const;
        Transition<T>& GetTransitionByName(const std::string& name_);
        void NewTransition(const Transition<T>& transition_, const State<T>& stateReached_);
     
        const T_type& GetType() const;
        T_type& GetType();
        void SetType(const T_type& type_);
     
      private :
        std::string _name;
        std::map<Transition<T>& , State<T>& > _transitionsList; //<--c'est ce truc qui est dur à manipuler...
        T_type _type;

    Parmi les méthodes que je 'arrive pas à utiliser dans mon main...

    ...voici le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template<typename T>
    State<T>::State(const std::string& name_, const std::map< Transition<T>& , State<T>& > transitionsList_, const T_type& type_ = intermediaire) :
    _name(name_),
    _transitionsList(transitionsList_),
    _type(type_)
    {
        //nothing to do
    }
    ....NewTransition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename T>
    void State<T>::NewTransition(const Transition<T>& transition_, const State<T>& stateReached_)
    {
        _transitionsList[transition_] = stateReached_;
    }
    ..et enfin en voici mon utilisation (dans le main) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
        const Transition<std::string> str_transition("hello World", "transition 1");
        std::map<Transition<std::string>&, State<std::string>& > str_map;
        State<std::string> state1("state1",str_map );
     
        state1.NewTransition(str_transition, state1);
    voici le message d'erreur (mais je penses que même sans vous allez vite voir que mon code cloche...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.0\include\c++\bits\stl_map.h|128|instantiated from 'std::map<Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, State<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, std::less<Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&>, std::allocator<std::pair<Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, State<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&> > >'|
    C:\Program Files (x86)\CodeBlocks\Projets\FAST\main.cpp|10|instantiated from here|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.0\include\c++\bits\stl_tree.h|1407|error: forming pointer to reference type 'Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&'|
    C:\Program Files (x86)\CodeBlocks\Projets\FAST\State.cpp||In member function 'void State<T>::NewTransition(const Transition<T>&, const State<T>&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]':|
    C:\Program Files (x86)\CodeBlocks\Projets\FAST\main.cpp|13|instantiated from here|
    C:\Program Files (x86)\CodeBlocks\Projets\FAST\State.cpp|88|error: no match for 'operator[]' in '((State<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >*)this)->State<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_transitionsList[transition_]'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.0\include\c++\bits\stl_map.h|442|note: candidates are: _Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, _Tp = State<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, _Compare = std::less<Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&>, _Alloc = std::allocator<std::pair<Transition<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, State<s|
    ||=== Build finished: 2 errors, 0 warnings ===|

    Je penses que j'ai besoin d'une explication sur la manipulation des templates dans les maps...

    Merci d'avance pour ceux qui auront le courage de m'aider.

    Ps : j'aimerais bien rendre le paramètre listtransitions_ facultatif dans mon constructeur, mais je ne vois pas ce qu'on peut mettre comme valeur par défaut pour une map.. :/ ?

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Je n'ai pas tout regardé, j'ai juste regardé la ligne ou tu déclares ta map.


    Tu demandes des références. Hors c'est uste IMPOSSIBLE. Les types que tu dois fournir doivent pouvoir être asignables, ce qui n'est pas le cas d'une référence.


    N'utilise pas de références dans les conteneurs. Il se peut que tu ai besoin de'un pointeur, d'une copie ou d'un smart pointer, mais jamais d'une référence.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,

    Citation Envoyé par Kaamui Voir le message
    snip
    Je penses que j'ai besoin d'une explication sur la manipulation des templates dans les maps...
    Comme le dit Klaim, tu ne peux pas mettre de référence dans un conteneur. (enfin, pas de façon naturelle).

    Citation Envoyé par Kaamui Voir le message
    Ps : j'aimerais bien rendre le paramètre listtransitions_ facultatif dans mon constructeur,
    Propose 2 constructeurs, un pour chaque signature.

    Citation Envoyé par Kaamui Voir le message
    mais je ne vois pas ce qu'on peut mettre comme valeur par défaut pour une map.. :/ ?
    Un map vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef const std::map< Transition<T>, State<T> > map_ctype;
    State(const std::string& name_, map_ctype transitionList_ = map_ctype(), const T_type& type_=intermediaire);
    Au fait, en général on déconseille les noms commençant par des '_' laissés aux implémentations des compilateurs. cf F.A.Q. Quels sont les identificateurs interdits par la norme ?

  4. #4
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,

    Comme le dit Klaim, tu ne peux pas mettre de référence dans un conteneur. (enfin, pas de façon naturelle).


    Propose 2 constructeurs, un pour chaque signature.

    Un map vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef const std::map< Transition<T>, State<T> > map_ctype;
    State(const std::string& name_, map_ctype transitionList_ = map_ctype(), const T_type& type_=intermediaire);
    Au fait, en général on déconseille les noms commençant par des '_' laissés aux implémentations des compilateurs. cf F.A.Q. Quels sont les identificateurs interdits par la norme ?

    D'accord c'est parfait. Je corrige ça et je change aussi ma nomenclature (heureusement que vous me l'avez dit maintenant, j'avais une centaine de classes respectant cette nomenclature

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/07/2009, 13h19
  2. [POO] Insertion d'un template dans une map
    Par JSmey dans le forum Langage
    Réponses: 6
    Dernier message: 27/11/2008, 11h50
  3. Destruction dans une map
    Par Clad3 dans le forum C++
    Réponses: 3
    Dernier message: 21/08/2005, 08h45
  4. Inserer des elements dans une map sans rangement ?
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 07/09/2004, 11h09
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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