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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    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,

    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)
    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

  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 : 50
    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
    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 ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  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
    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 confirmé
    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
    Par défaut
    J'ai fait une classe de base et ça marche niquel

    Merci beaucoup.

  6. #6
    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
    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