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] spécialisation fonction membre template, class non template


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut [Template] spécialisation fonction membre template, class non template
    Bonjour,

    j'ai de petits soucis avec la spécialisation d'une fonction membre ; la seule solution que j'ai trouvée étant pour l'instant de la déclarer toujours en inline (VC++ 2005).

    Exemple:
    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
    35
    #pragma once
    #ifndef __TTESTTEMPLATE__ 
    #define __TTESTTEMPLATE__ 
     
    class TTestTemplate
    {
    public:
        template<typename T>
        int FnctMembre(T t)
        {
            return 1;
        }  
     
        // Passe en VC++, mais pas vraiment légal en C++ il me semble
        template<>
        int FnctMembre<int>(int t)
        {
            return 2;
        }
    };
     
    /* Problème à l'édition des liens (la fonction se trouve déclaré dans plusieurs modules) 
    template<>
    int TTestTemplate::FnctMembre<char>(char t)
    {
        return 3;
    }
    */
     
    template<>
    inline int TTestTemplate::FnctMembre<double>(double t)
    {
        return 4;
    }
    #endif //__TTESTTEMPLATE__
    Cette spécialisation doit-elle alors toujours être inline ?
    Remarque : il m'est déjà arrivé de placer des spécialisations dans un cpp, en ne donnant pas l'implémentation par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // .h
    class TTestTemplate
    {
    public:
        template<typename T>
        int FnctMembre(T t); // échoue si il n'existe pas une spécialisation adéquate
    };
    // .cpp
    template<>
    int TTestTemplate::FnctMembre<char>(char t)
    {
       return 1;
    }
    Mais cela force à ne pas donner l'implémentation par défaut, sinon elle sera utilisée pour générer une spécialisation et entrera en conflit l'autre (de plus je ne suis pas très sur de la légalité d'un tel code ).

  2. #2
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonjour,

    Ça s'écrit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        template<>
        int FnctMembre<>(int t)
        {
            return 2;
        }
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    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
    Salut
    Tu peux déclarer tes spécialisations dans le .h et les définir dans le .cpp :
    // .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class TTestTemplate
    {
    public:
        template<typename T>
        int FnctMembre(T t){//version par defaut}
    };
    template<> int TTestTemplate::FnctMembre<char>(char t);
    template<> int TTestTemplate::FnctMembre<std::string>(std::string t);
    template<> int TTestTemplate::FnctMembre<CMaClasse>(CMaClasse t);
    //.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<> int TTestTemplate::FnctMembre<char>(char t)
    {
    ...
    }
    template<> int TTestTemplate::FnctMembre<std::string>(std::string t)
    {
    ...
    }
    template<> int TTestTemplate::FnctMembre<CMaClasse>(CMaClasse t)
    {
    ...
    }
    Bien sûr la version général doit rester dans le .h

  4. #4
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Merci pour vos réponses.
    Citation Envoyé par Florian Goo Voir le message
    Ça s'écrit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        template<>
        int FnctMembre<>(int t)
        {
            return 2;
        }
    Je n'étais pas sûr si c'était légal (VC++ l'accepte, mais entre VC++ accepte et être autorisé en C++, comment dire ... ).

    Citation Envoyé par 3DArchi Voir le message
    Salut
    Tu peux déclarer tes spécialisations dans le .h et les définir dans le .cpp :
    // .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class TTestTemplate
    {
    public:
        template<typename T>
        int FnctMembre(T t){//version par defaut}
    };
    template<> int TTestTemplate::FnctMembre<char>(char t);
    template<> int TTestTemplate::FnctMembre<std::string>(std::string t);
    template<> int TTestTemplate::FnctMembre<CMaClasse>(CMaClasse t);
    //.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<> int TTestTemplate::FnctMembre<char>(char t)
    {
    ...
    }
    template<> int TTestTemplate::FnctMembre<std::string>(std::string t)
    {
    ...
    }
    template<> int TTestTemplate::FnctMembre<CMaClasse>(CMaClasse t)
    {
    ...
    }
    Excellent .
    Cella permet aussi d'exclure la version générale par un static assert (Boost, fait maison ou C++0x), plus propre que de laisser l'édition des liens échouer.
    Merci encore

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/08/2014, 17h29
  2. Réponses: 4
    Dernier message: 03/08/2012, 08h36
  3. Réponses: 18
    Dernier message: 01/03/2012, 10h34
  4. Réponses: 3
    Dernier message: 08/07/2008, 15h06
  5. Problèmes de fonctions membres de classe templates, gcc3.3.6
    Par yves.dessertine dans le forum Autres éditeurs
    Réponses: 12
    Dernier message: 17/10/2005, 21h36

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