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 :

Problème de typedef avec template


Sujet :

Langage C++

  1. #1
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut Problème de typedef avec template
    Bonjour,
    désolé pour les deux questions le même jours, mais bon ce problème là est un peu plus chiant que l'autre.

    Alors voilà, comme d'habitude, je suis l'article de Laurent à propos de la création d'un moteur 3D et là j'ai réalisé le MediaManager.
    Là où j'ai un soucis, c'est dans ce code: (j'ai enlevé les parties inutile)

    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
    33
    34
    35
    36
     
        class Mesh {
        };
     
        template <typename T>
        struct MediaHolder {
            typedef std::map<std::string, boost::shared_ptr<Loader<T> > > LoaderMap;
     
            LoaderMap loaders; //!< Map contenant les loaders.
        };
     
        //! Liste des medias supportés.
        typedef TYPELIST_1(Mesh) Medias;
     
     
        class MediaManager : public Hierarchy<Medias, MediaHolder> {
            public:
                MediaManager();
     
                ~MediaManager();
     
                FileName findMedia(const FileName& filename);
     
     
            private:
                std::vector<std::string> searchPath;
        };
     
     
        template <typename T>
        Loader<T>* MediaManager::findLoader(const std::string& extension) const {
            // Rechercher l'extension dans la liste des extension supportées par le loader.
            MediaHolder<T>::LoaderMap::iterator it;
     
            return NULL;
        }
    Et l'erreur se situe à la ligne " MediaHolder<T>::LoaderMap::iterator it; "
    Il me dit: ; expected before it.

    Quelqu'un voit d'où peut venir l'erreur ?
    En lisant la FAQ on peut y lire des choses à propos de typename au lieu de typedef, mais même en utilisant ce principe mon problème reste le même.

    Il faut savoir aussi, j'ai essayé de mettre:
    std::map<std::string, boost::shared_ptr<Loader<T> > >::iterator it;
    ça n'a pas marché.
    Par contre, si je fais:
    std::map<std::string, boost::shared_ptr<Loader<Mesh> > >::iterator it;
    là ça marche ...

    J'espère que quelqu'un pourra m'aider.
    Merci d'avance. ^^

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575

  3. #3
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut
    C'est justement ce point de la faq dont je faisais référence. Et le soucis est identique: même erreur de compilation.

    Il y a eu du nouveau entre temps, après la lecture d'un article, j'ai fait ceci dans ma fonction findLoader:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        //! Trouver le loader adequate par rapport à l'extension.
        template <typename T>
        Loader<T>* MediaManager::findLoader(const std::string& extension) const {
            typedef typename std::map<std::string, boost::shared_ptr<Loader<T> > >::iterator LoaderMapIterator;
     
            // Rechercher l'extension dans la liste des extension supportées par le loader.
            LoaderMapIterator it;
     
            return NULL;
        }
    Ca marche, mais c'est sale ...
    Je comprend vraiment pas pourquoi le point de la faq ne marche pas dans mon cas. Suis-je obligé de passer par cette methode pas très jolie ? :/

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Mais non.

    Il suffit de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::map<std::string, boost::shared_ptr<Loader<T> > > LoaderMap;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef  typename std::map<std::string, boost::shared_ptr<Loader<T> > > LoaderMap;
    Quelle erreur obtiens-tu quand tu fais cela ?

  5. #5
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut
    J'obtiens exactement la même erreur:
    expected `;' before "it"|

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Les commentaires de Alp (écrire typedef typename std::map< ... > tontype;), c'est n'importe quoi. Il ne faut pas utiliser typename dans ces cas-là.
    Quel est le problème avec ton code ? Tu as écrit toi-même la solution quelques messages au-dessus.

    typename est uniquement nécessaire quand on accède à un membre statique d'une classe template dont les paramètres ne sont pas connus lors de cette phase (i.e. ils sont issus d'autres paramètres templates).
    Par défaut un tel membre est une valeur. S'il s'agit d'un type, il faut donc l'indiquer avec typename.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut
    Bah, oui mon code est bon, mais bon ça fait quand même legerement sale non ?

    D'accord, je comprend un peu mieux l'utilité de typename.
    Si jamais ça interesse certaines personnes: http://pages.cs.wisc.edu/~driscoll/typename.html c'est un article qui m'a pas mal aidé, donc voilà.

    Si tu dis que mon code va loufoque, j'vais te faire confiance. =)
    Je vous remercie pour vos réponses. ^^

    [=> Résolu]

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/09/2013, 12h04
  2. Réponses: 4
    Dernier message: 23/03/2011, 12h07
  3. Problème de linkage avec template
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2008, 16h34
  4. Problèmes de linking avec templates
    Par oodini dans le forum C++
    Réponses: 8
    Dernier message: 19/06/2007, 15h32
  5. [phpBB] Function avec le Template phpBB
    Par mangafan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/09/2005, 16h32

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