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 :

classe template et map


Sujet :

Langage C++

Vue hybride

Peeter classe template et map 05/12/2010, 14h10
Mat007 Salut, Ajoute typename... 05/12/2010, 17h20
Peeter Merci!! 08/12/2010, 10h04
koala01 Salut, et bienvenue sur le... 11/12/2010, 12h45
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut classe template et map
    Bonjour,

    je suis nouveaux sur les templates et je ne comprends pas pourquoi le code suivant de compile pas (avec g++ sous OSX):
    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
    25
    26
    27
    28
    29
    30
    31
    32
    #ifndef RESSOURCEMANAGER_H
    #define RESSOURCEMANAGER_H
     
    #include <map>
    #include <string>
     
    template <class T>
    class RessourceManager
    {
        std::map<std::string, T> _ressourceDb;
     
    public:
        RessourceManager() {}
        /**
          *
          */
        T getRessource(const std::string & ressourceName)
        {
     
    	std::map<std::string, T>::iterator it = _ressourceDb.find(ressourceName);
    	if(it == _ressourceDb.end())
    	{
    	    //_ressourceDb.insert(createRessource(ressourceName));
    	}
    	return it;
        }
     
        //virtual T createRessource(const std::string & ressourceName) = 0;
    };
     
     
    #endif // RESSOURCEMANAGER_H
    Les erreurs de compilation sont les suivantes:
    ../Alpha/RessourceManager.h: In member function 'T RessourceManager<T>::getRessource(const std::string&)':
    ../Alpha/RessourceManager.h:20: error: expected `;' before 'it'
    ../Alpha/RessourceManager.h:21: error: 'it' was not declared in this scope
    ../Alpha/RessourceManager.h:25: error: 'it' was not declared in this scope

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Ajoute typename devant, cf. cette entrée de la FAQ.

    MAT.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut
    Merci!!

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum.

    Fais cependant attention au fait que, classiquement, un itérateur de std::map itère sur... des paires clé / valeurs

    Si tu tentes de renvoyer it, tu renverra autre chose qu'un T, car tu renverra... un std::map<std:: string, T>::iterator, c'est à dire un iterator<std::pair<std::string, T> > et le compilateur ne va pas aimer cela

    Tu devras donc renvoyer... it->second pour effectivement renvoyer ton T

    De plus, vu que tu renvoie un T et non une référence sur T, tu renverras... une copie de l'objet présent dans la std::map, or, je présumes que tu souhaites que tout ce que ut pourrais faire avec l'objet récupéré soit... répercuté sur l'objet géré par ton manager(re ).

    Tu devrais donc faire en sorte de renvoyer, non pas un objet de type T, mais une référence sur un tel objet

    Ta fonction getRessource devrait donc au final prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        T& getRessource(const std::string & ressourceName)
        {
     
    	std::map<std::string, T>::iterator it = _ressourceDb.find(ressourceName);
    	if(it == _ressourceDb.end())
    	{
    	    //_ressourceDb.insert(createRessource(ressourceName));
                /* !!!   si tu insère un nouvel élément dans ta map, tu dois
                 * veiller à ce que ton iterateur soit effectivement affecté à
                 * cet élément ;) !!!
                 */
    	}
    	return it->second;
        }
    PS : pense à cliquer sur le bouton lorsque ton problème sera réglé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ 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. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  3. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56
  4. Class template hérité
    Par Azharis dans le forum Langage
    Réponses: 4
    Dernier message: 24/06/2005, 22h03
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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