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] template, pointeur et allocation


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut [template] template, pointeur et allocation
    Bonjour,

    prenons par exemple le code suivant (dum.h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    class Dum
    {
    //... code
    };
    Je ne comprend pas pourquoi je n'ai pas le droit de déclarer un pointeur sur Dum sans spécifier les paramètres templates:

    Me génère l'erreur suivante:
    1>c:\dev\test_template\test_template.cpp(8) : error C2955: 'Dum' : use of class template requires template argument list
    En effet, un pointeur est juste une adresse, qui a donc une taille fixe. C'est lorsqu'on fait le new() qu'il va allouer la mémoire et donc avoir besoin des paramètres templates.

    En fait, l'idée est de pouvoir faire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dum * dum;
    if ( condition )
       dum = new Dum<int>();
    else
       dum = new Dum<string>();
    Enfin bref, ma question est la suivante: Pourquoi n'ai-je pas le droit de déclarer un pointeur sur une classe template sans en spécifier les paramètres templates?

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par r0d Voir le message
    Bonjour,

    prenons par exemple le code suivant (dum.h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T>
    class Dum
    {
    //... code
    };
    Je ne comprend pas pourquoi je n'ai pas le droit de déclarer un pointeur sur Dum sans spécifier les paramètres templates:

    Me génère l'erreur suivante:


    En effet, un pointeur est juste une adresse, qui a donc une taille fixe. C'est lorsqu'on fait le new() qu'il va allouer la mémoire et donc avoir besoin des paramètres templates.

    En fait, l'idée est de pouvoir faire quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dum * dum;
    if ( condition )
       dum = new Dum<int>();
    else
       dum = new Dum<string>();
    Enfin bref, ma question est la suivante: Pourquoi n'ai-je pas le droit de déclarer un pointeur sur une classe template sans en spécifier les paramètres templates?
    Parce que dum<X> et dum<Y> sont deux types différents, potentiellement non reliés entre eux (la spécialisation peut les changer du tout au tout). Avoir la possibilité de passer par dum* (sans paramètres) reviendrait dans ce cas à autoriser le passage par void* ; on perd donc toutes les informations de type.

    Au delà de ça, pour qu'un nom déclaré puisse être utilisé, il faut qu'il fasse référence à quelque chose qui existe vraiment - hors, le type dum n'existe pas, alors que dum<T> existe.

    Si tu veux faire quelque chose de similaire, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class dum_base { ... }
    template <class T>
    class dum : public dum_base
    {
    public:
      // sans oublier : 
      virtual ~dum() { ... }
    };
    Du coup, toutes tes classes dum<T> vont dériver de dum_base, sauf si tu spécialiser dum<X> pour ne pas en dériver. Tu pourras écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dum_base * db;
     
    if (cond) db = new dum<T1>();
    else db = new dum<T2>();
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Okay j'ai compris.


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

Discussions similaires

  1. Problème avec template template template
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 23/11/2012, 14h40
  2. Templates et pointeurs de fonctions
    Par feda12 dans le forum C++
    Réponses: 7
    Dernier message: 09/03/2011, 10h04
  3. Sérialization, templates et pointeurs
    Par coda_blank dans le forum Boost
    Réponses: 10
    Dernier message: 30/07/2010, 22h46
  4. Template et Pointeur sur Predicat
    Par sas dans le forum Langage
    Réponses: 8
    Dernier message: 08/10/2007, 17h07
  5. template et pointeur de fonction.
    Par ZaaN dans le forum Langage
    Réponses: 10
    Dernier message: 11/08/2007, 08h15

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