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 :

Comment faire une liste d'un template sans préciser son type ?


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut Comment faire une liste d'un template sans préciser son type ?
    Bonjour,

    Voila j'ai un template CompteEnBanque<T> et j'aimerais pouvoir créer une liste de comptes avec des classes T quelconques dans une autre classe, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::list<CompteEnBanque<T> > Cplist;
    J'ai essayé de l'écrire de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::list<CompteEnBanque> Cplist;
    Où encore de celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::list<CompteEnBanque<?> > Cplist;
    Mais rien y fait.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 689
    Points
    30 689
    Par défaut
    Salut,

    C'est quelque part normal:

    Il faut que ton typedef fournisse ce que l'on pourrait appeler un "type complet", dont le compilateur peut calculer la place qu'il prend en mémoire.

    Tant que tu n'aura pas fournis un type réel à CompteEnBanque, tu ne pourra pas y arriver.

    Tu pourrais très bien envisager quelque chose dan le genre 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    /* ta classe CompteEnBanque */
    template <class T>
    class CompteEnBanque
    {
        /* son contenu */
    };
    /* et deux structures permettant de spécialiser la classe
        (qui serviront, d'une certaine manière, comme traits de politique */
    struct CCP
    {
        /* les données d'un "compte cheque postal" */
    };
    struct CompteEpargne
    {
        /* les données d'un "compte d'épargne" */
    };
    typedef std::list<CompteEnBanque<CCP> > ListeCCP;
    typedef std::list<CompteEnBanque<CompteEpargne> > ListeCompteEpargne;
    /* allez, amusons nous à créer la structure client */
    struct Client
    {
        std::string nom;
        std::string prenom;
        ListeCCP ccps:
        ListeCompteEpargnes epargnes;
    };
    int main()
    {
        Client moi;
        moi.nom="koala";
        moi.prenom="main à la pâte";
        moi.ccps.insert(CompteEnBanque<CCP>("000-000000012-12"));
        moi.ccps.insert(CompteEnBanque<CCP>("000-000000096-96"));
    }
    (la vérification (selon les regles en cours en belgique) pourra sembler donner des comptes valides... mais ce ne sont pas les miens )

    Une autre solution, qui, il faut le préciser, n'est vraiment pas conseillée, serait, au lieu de créer un alias de type de std::list, de créer une classe template qui hérite de la std::list, sous une forme sans doute proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    class ListeComptes : public std::list< CompteEnBanque<T> >
    {
     
    };
    Un compilateur bien réglé devrait à cette occasion te lancer un avertissement proche de
    warning: base class 'class std::list<CompteEnBanque<CCP>, std::allocator<CompteEnBanque<CCP> > >' has a non-virtual destructor|
    avertissement qui justifie que la pratique ne soit vraiment pas conseillée, et qu'il vaut vraiment mieux prendre en compte, à moins que tu ne considère ListeComptes que comme une classe qui "réalise" une spécialisation de std::list (c'est à dire, qui n'y rajoute aucun membre, et qui n'en modifie pas les comportements)

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Autre solution (dans ce cas, on n'y gagne pas grand'chose, dans d'autres cas, ça peut servir) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T> class Cplist
    {
      typedef std::list<CompteEnBanque<T> > type;
    };
     
     
    Cplist<Piniolo>::type listeDeCompteDeClowns;
    L'idéal serait d'utiliser les alias template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <class T> using Cplist = std::list<CompteEnBanque<T> >;
    Le seul problème, c'est que ce n'est pas encore du C++ valide, puisque ça fait partie de C++0x. Mais qui sait, peut-être certains compilateurs vont-ils commencer à mettre ça en place ?

  4. #4
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Si ton but est d'avoir des listes de CompteEnBanque<T> panachée (par exemple CompteEnBanque<Toto> et CompteEnBanque<Titi>), tu le peux soit avec boost::any soit en utilisant une classe de base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class CompteEnBanqueBase
    {
    ...
    };
    template<class T>
    class CompteEnBanque :public CompteEnBanqueBase
    {
    ...
    };
    std::list<CompteEnBanqueBase*> ma_liste;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 172
    Points : 117
    Points
    117
    Par défaut
    J'ai fait une classe de base et ça marche niquel

    Merci beaucoup.

  6. #6
    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 860
    Points
    11 860
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Si ton but est d'avoir des listes de CompteEnBanque<T> panachée (par exemple CompteEnBanque<Toto> et CompteEnBanque<Titi>), tu le peux soit avec boost::any soit en utilisant une classe de base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class CompteEnBanqueBase
    {
    ...
    };
    template<class T>
    class CompteEnBanque :public CompteEnBanqueBase
    {
    ...
    };
    std::list<CompteEnBanqueBase*> ma_liste;
    Ce sont les deux méthodes que je conseille.
    Boost.Variant pourrait aussi aller dans le cas ou le nombre de types qui peuvent être passés au template est assez petit.

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

Discussions similaires

  1. Comment faire une liste de checkbox "groupée" ?
    Par Tchupacabra dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2008, 10h58
  2. Réponses: 14
    Dernier message: 09/04/2008, 14h45
  3. [Vb.net] Comment faire une liste à partir d'une string
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 1
    Dernier message: 25/10/2006, 14h15
  4. Comment faire une liste d'évènements ?
    Par WebPac dans le forum Langage
    Réponses: 4
    Dernier message: 16/02/2006, 10h36
  5. Comment faire une liste d'image de choix ?
    Par poussinphp dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/10/2005, 00h34

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