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 map avec paramètre template


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut Problème de map avec paramètre template
    Bonjour, j'ai un problème que je ne comprends pas, voici le code:

    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
     
    #include <map>
     
    using namespace std;
     
    template<class Type>
    class Test {
    public:
    	void bidon() {
    		map<int,int>::iterator it1;	   // OK
    		map<int, Type*>::iterator it2;	// Plante à cause du paramètre Type*
    	}
    };
     
    int main(int argc, char** argv) {
    	Test<int> test;
    	test.bidon();
    	return 0;
    }
    Le problème est que mon compilateur ne veux pas de la déclaration du deuxième itérateur. Apparemment celà viendrait du type template (Type*), pourquoi ? Comment résoudre ce problème ?

    Voici les erreurs que mon compilateur me renvoi:

    g++ main.cpp -o test
    main.cpp: In member function 'void Test<Type>::bidon()':
    main.cpp:16: error: expected `;' before 'it2'
    main.cpp: In member function 'void Test<Type>::bidon() [with Type = int]':
    main.cpp:25: instantiated from here
    main.cpp:16: error: dependent-name 'std::map<int,Type*,std::less<int>,std::allocator<std::pair<const int, Type*> > >::iterator' is parsed as a non-type, but instantiation yields a type
    main.cpp:16: note: say 'typename std::map<int,Type*,std::less<int>,std::allocator<std::pair<const int, Type*> > >::iterator' if a type is meant
    Savez-vous comment résoudre celà ?

    Merci.

    Bouba

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La solution est donnée par le compilo :
    say 'typename std::map<int,Type* [...] >::iterator' if a type is meant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename map<int, Type*>::iterator it2;

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Ouai, merci, c'est bon.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    en fait, le compilateur a besoin d un petit cout de pouce pour comprendre (ajout du mot cle typename)

    en prenant l exemple ci-dessous on comprend mieux pourquoi ?

    template<typename T> class X {

    typedef int type;
    };

    template<> class X<int> { /* une specialisation de X */

    static const int type = 3;
    };


    au moment de la compilation de ton template, le compilateur est incapable de savoir comment traiter Type !! (dans mon exemple si par hazard T etait int, la symbologie de type serait completement differente)

  5. #5
    Membre régulier
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 94
    Points : 94
    Points
    94
    Par défaut
    Ah, ok, merci, j'ai pigé.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    note que tu as un soucis homologue avec des template imbrique (courant dans boost::mpl)

    struct machin {

    template<int> struct apply {

    };

    };

    template<T> struct essai {

    ... T::apply<3> ...

    };

    la encore si apply etait un entier la symbologie serait quelque chose comme

    ... (apply < 3) > ...

    ce qui est un boolean

    on peut resoudre le probleme avec un coup de pouce au compilo:

    ... T::template apply<3> ...

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

Discussions similaires

  1. Problème de mapping avec clés composées
    Par goeland444 dans le forum Hibernate
    Réponses: 1
    Dernier message: 06/04/2008, 19h57
  2. Problème affichage subreport avec paramètre
    Par gamma dans le forum iReport
    Réponses: 6
    Dernier message: 12/04/2007, 14h54
  3. Problème de lien avec paramêtre et facelets
    Par Tikaf dans le forum JSF
    Réponses: 2
    Dernier message: 08/01/2007, 11h14
  4. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  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