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 et type par defaut


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut Template et type par defaut
    Bonjour a tous,
    En fait je me demendais si il était possible pour une classe template de lui donner un type par defaut si il n'était pas précisé ?

    Un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class T = MaClasseParDefaut> class MonVecteur;
    template<class T>class MonVecteur{
     private:
       ...
     public:
       ...
    };
    le but etant de ne pas tout le temps devoir écrir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonVecteur<MaClasseParDefaut> vec;
    mais plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MonVecteur vec;
     
    //et si besoin est:
    /MonVecteur<UneAutreClasse> vec;
    Le premier example de code que j'ai fourni a été trouvé sur le net, on passe un parametre par defaut en déclaration de la classe avant de la définir. Ca ne fait pas grand chose, en tout cas pas sous visual studio qui pour la ligne :

    MonVecteur vec;
    me retourne :

    Error 1 error C2955: 'MonVecteur' : use of class template requires template argument list
    C'est possible ou pas ^^ ?
    (ps: Je me demande a l'instant si l'utilisation de Traits pourrait résoudre mon probleme? Mais je vois pas trop comment )

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Aie ça link plus, mais c'est valable que je precise la classe ou pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Error	1	error LNK2019: unresolved external symbol "public: virtual __thiscall MonVecteur<class MaClasseParDefaut>::~MonVecteur<class MaClasseParDefaut>(void)" (??1?$MonVecteur@VMaClasseParDefaut@@@@UAE@XZ) referenced in function _main	testcase.obj
    Je crois que c'est encore ce fichu probleme de link qui disparait quand je mes tout le code de ma classe dans la definition du .h

    Tant qu'a faire quelqu'un sait comment éviter ça ?
    Dans mon cpp la syntax que j'utilise est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    template<class T> bool MonVecteur<T>::maFonction(const T& t){
    ...
    }

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Le fait de tout mettre dans le .h résout le probleme... Je ne comprends pas pourquoi?

    Sinon merci pour la syntax poukill. Cela dit exite-il un moyen d'écrire:
    a la place de :
    ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tant qu'a faire quelqu'un sait comment éviter ça ?
    En mettant tout code dépendant d'un paramètre template dans les entêtes. (fichiers .h)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    merci pour l'astuce ! Dommage par contre pour le fait qu'il ne soit pas conseillé de garder une extension classique ! Enfin cela dit c'est bien plus lisible.

    Bon sinon pour en revenir a nos moutons ?

    Un moyen pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonVecteur vec;
    //en lieu et place de :
    MonVecteur<> vec;
    ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    J'ai bien essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    typedef MonVecteur<> MonVecteur;
    //ou bien
    typedef MonVecteur<MaClasseParDefaut> MonVecteur;
    Mais ça ne marche pas :

    Error 1 error C2921: redefinition : 'MonVecteur' : class template is being redeclared as 'typedef MonVecteur<T> MonVecteur'

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Tu n'aurais pas oublié les gardes anti-réinclusion ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Tu n'aurais pas oublié les gardes anti-réinclusion ?
    En fait je vien de tomber sur ce lien (en anglais): https://forums.microsoft.com/MSDN/Sh...36621&SiteID=1

    qui reprend entre autre une partie de mon probleme c'est a dire:
    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
     
    /*Say I have this template class*/
     
    template<int n>
    class TemplateClass {};
     
    /*then this line of code will generate compiler error C2921:*/
     
    typedef TemplateClass<3> TemplateClass;
     
    /*which makes sense, since the typedef has the same name as the template
     
    class. However, when I enclose the typedef in a namespace, no complaints 
     
    are being made by the compiler
    */
     
    namespace Namespace
    {
        typedef TemplateClass<3> TemplateClass;
    }
     
    /*which also makes sense to me, since you could argue that within
     
    Namespace you only want a specific instantiation of TemplateClass1. This 
     
    would save you the trouble of writing the template parameter all the time, 
     
    although I agree that this doesn't deserve an award for clarity.
    */
    En mettant mon typedef dans un namespace je me debarasse effectivement de l'erreur C2921 par contre j'obtiens ceci a présent :

    Error 1 error C2872: 'MonVecteur' : ambiguous symbol
    Et ce pour "MonVecteur<T>" dans les lignes (de mon fichier associé, grace a ton astuce précédente):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MonVecteur<T>::MonVecteur(){
    }
     
    MonVecteur<T>::~MonVecteur(){
    }
    mais pas pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool MonVecteur<T>::add(const T& t){
    }
    par example.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    En fait je précise que le probleme que j'évoque juste au dessus apparait des lors que je fais dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonNamespace::MonVecteur vec;
    Le fait que le compilateur se plaigne dans l'implementation de la classe MonVecteur et non dans la ligne du main est du à quoi d'apres vous ? Un probleme d'inclusions multiples ?

  12. #12
    Membre régulier

    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 105
    Points
    105
    Par défaut
    Citation Envoyé par jpcohen Voir le message
    Bonjour a tous,
    En fait je me demendais si il était possible pour une classe template de lui donner un type par defaut si il n'était pas précisé ?

    Un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class T = MaClasseParDefaut> class MonVecteur;
    template<class T>class MonVecteur{
     private:
       ...
     public:
       ...
    };
    Bas heu, si j'ai bien compris (je commence à douter, ça fais plusieurs fois que je passe pour un con en ce moment ), il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template < class T = ClassParDefaut >
    class ClassTemplate {
        // definition goes here
    };
    A ma connaissance, c'est standard.
    Evidement, tu dois inclure la definition complete du template.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par Aszarsha Voir le message
    Bas heu, si j'ai bien compris (je commence à douter, ça fais plusieurs fois que je passe pour un con en ce moment ), il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template < class T = ClassParDefaut >
    class ClassTemplate {
        // definition goes here
    };
    A ma connaissance, c'est standard.
    Evidement, tu dois inclure la definition complete du template.
    Aszarsha:

    Citation Envoyé par jpcohen Voir le message
    merci pour l'astuce ! Dommage par contre pour le fait qu'il ne soit pas conseillé de garder une extension classique ! Enfin cela dit c'est bien plus lisible.

    Bon sinon pour en revenir a nos moutons ?

    Un moyen pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MonVecteur vec;
    //en lieu et place de :
    MonVecteur<> vec;
    ?
    L'astuce en question est fort sembable a ce que tu me propose, par contre ce la m'oblige toujours a écrire:
    au lieu de pouvoir faire:
    Sinon Aszarsha toute aide est la bienvenue, je crois que meme si on se plante dans un post ça ne doit pas retirer la satisfaction d'avoir pu proposer son aide

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

Discussions similaires

  1. [phpMyAdmin] Type date champ par defaut
    Par MANU_2 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 12/03/2008, 11h12
  2. Réponses: 2
    Dernier message: 17/08/2007, 16h51
  3. valeur par defaut d'un parametre de type date
    Par h_a_m_a_d_a dans le forum BIRT
    Réponses: 8
    Dernier message: 23/02/2007, 12h43
  4. Valeur par defaut dans ActiveX de type Calendar
    Par Sam 069 dans le forum Access
    Réponses: 3
    Dernier message: 30/11/2006, 11h42
  5. Valeur par defaut 'True' dans un champ de type bit
    Par Mouse dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2003, 16h26

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