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 :

[template] - declaration d'un template de structure dans une map


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [template] - declaration d'un template de structure dans une map
    Bonjour,

    Voila mon souci : je declare une structure dans laquelle un des parametres peut avoir differents types, donc j'utilise un template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>
    		struct tInfos
    		{
    			string sStr;
    			T tType;  // il peut y avoir differents types pour ce parametre
    		};
    ensuite, j'ai besoin de creer une map qui va contenir ces structures que je viens de declarer. Je fais donc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef map<int,tInfos> m_TMyMap;
    Mais ca ne passe pas a la compilation, ca me dit que le 2eme argumemt de ma map est incorrect...

    j'ai essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef map<int,template<T>tInfos<T>> m_TMyMap;
    , mais la ca me dit que le type "T" est inconnu...

    Est-ce quelqu'un voit de quelle maniere je dois declarer ma map?

    Merci davance!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Hum... tu es obligé de spécifier le type T de ta structure.
    Tu ne peux pas avoir une map de tInfos de n'importe quel type. Tu dois donc instancier ton template.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef map<int, tInfos<double> > m_MyMapDouble;
    C'est un problème classique du GotW.
    http://www.gotw.ca/gotw/079.htm

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    tInfos est une structure template, faut préciser le type. Si ton idée était de faire un template typedef alors sache que c'est pas possible pour l'instant en C++. (ça le sera avec la prochaine norme).

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Points : 168
    Points
    168
    Par défaut
    Pour ce genre de probleme, j'utilise souvent la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct tInfosBase
    {
       string sStr;
    };
     
    template <typename T>
    struct tInfos : public tInfosBase
    {
       T tType;  // il peut y avoir differents types pour ce parametre
    };
     
    typedef map<int,tInfosBase*> TMyMap;
    Mais attention, tu manipules desormais des pointeurs de tInfosBase.
    --
    Jérémie

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Pour contourner ce manque je préfére faire du template rebinding.. Quitte à me trimballer un ::type disgracieux.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    @Goten : mon but, c'est de faire une map qui contiendra des structures, dans lesquelles le type d'un des paramètres peut varier. Toutes les structures ne contiendront pas forcément le même type.
    Je veux pouvoir avoir dans ma map :
    • une structure avec le type int
    • une srtucture avec le type double
    • une structure avec le type...


    Je ne veux donc pas déclarer quelque chose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef map<int, tInfos<double> > m_MyMapDouble;
    ça ne correspond pas à ce que je veux faire...

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par albireo_29 Voir le message
    @Goten : mon but, c'est de faire une map qui contiendra des structures, dans lesquelles le type d'un des paramètres peut varier. Toutes les structures ne contiendront pas forcément le même type.
    Je veux pouvoir avoir dans ma map :
    • une structure avec le type int
    • une srtucture avec le type double
    • une structure avec le type...


    Je ne veux donc pas déclarer quelque chose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef map<int, tInfos<double> > m_MyMapDouble;
    ça ne correspond pas à ce que je veux faire...
    Regarde le type erasure, ce qui correspond à l'idée de boost::any

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre aide a tous, je vais me debrouiller avec tous vos conseils!

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Regarde le type erasure, ce qui correspond à l'idée de boost::any
    Pas la peine d'aller aussi loin. Avec boost::any, on n'a plus aucune fonction à appeler possible ou quoi.

    Ici, avoir une classe de base qui lui offre les services que doivent fournir tous ses tInfos ou quoi, ça suffira

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

Discussions similaires

  1. manipulation de template dans une map
    Par Kaamui dans le forum Langage
    Réponses: 3
    Dernier message: 03/03/2012, 15h21
  2. Declarer une structure dans une classe
    Par sub-0 dans le forum Débuter
    Réponses: 5
    Dernier message: 01/11/2009, 17h03
  3. Declarer une structure dans une methode
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 08/12/2008, 22h59
  4. [POO] Insertion d'un template dans une map
    Par JSmey dans le forum Langage
    Réponses: 6
    Dernier message: 27/11/2008, 11h50
  5. Réponses: 12
    Dernier message: 29/10/2008, 08h40

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