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

C++ Discussion :

Spécialisation partielle de template


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut Spécialisation partielle de template
    Bonjour tout le monde,
    Je bute sur un problème et je ne comprends pas comment le résoudre.

    J'essaie de spécialiser un seul de mes typename au niveau de mon template mais je n'y arrive pas:
    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
    template <typename A, typename B, typename C>
    class Test
    {
    public:
      void foo(const B & d)
      {
        //fait quelque chose
      }
    };
     
    template<typename B, typename C>
    void Test<int, B, C>::foo(const B & d)
    {
      //fait autre chose
    }
    Je suis avec clang (Apple LLVM version 6.0 (clang-600.0.56)), je compile en C++11 et j'obtiens l'erreur de compilation suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error: nested name specifier 'Test<int, B, C>::' for declaration does not refer into a class, class template or class template partial specialization
    void Test<int, B, C>::foo(const B & d)
         ~~~~~~~~~~~~~~~~~^
    La logique de mon raisonnement est de pouvoir avoir un autre comportement de fonction si le premier typename A est un int sans à se soucier des autres typenames.

    Première question, est-ce possible?
    Si oui, qu'est-ce que je fait de mal?

    Merci pour tout!

  2. #2
    Membre éprouvé Avatar de KsassPeuk
    Homme Profil pro
    Ingénieur Chercheur
    Inscrit en
    Juillet 2013
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juillet 2013
    Messages : 138
    Par défaut
    Lu'!

    C'est ta classe qui est template, c'est elle que tu dois partiellement spécialiser.

    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
    template <typename A, typename B, typename C>
    class Test
    {
    public:
      void foo(const B & d)
      {
        std::cout<<"most generic foo"<<std::endl;
      }
    };
     
    template<typename B, typename C>
    class Test<int, B, C>
    {
    public:
      void foo(const B & d)
      {
        std::cout<<"partially specialized foo"<<std::endl;
      }
    };
    Sinon, ton compilateur n'a pas connaissance de ce qu'est le type Test<int,B,C>, il est spécialisé mais cette spécialisation n'est pas déclarée.

    Si la spécialisation partielle ne concerne que cette fonction, tu peux éventuellement te demander s'il ne faudrait pas virer un paramètre template de la classe et déclarer la fonction comme elle même template dans la classe template.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Super merci beaucoup pour ta réponse qui fonctionne parfaitement... mais on doit redéfinir toutes les méthodes de la classes pour une spécialisation précise.
    Dans mon cas précis, je ne peux pas supprimer de paramètre template.

    Je me suis donc tourné vers l'utilisation de std::enable_if et de std::is_same.

    Voici un exemple un peu plus complexe:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    template <typename A, typename B, typename C>
    class Test
    {
    public:
      template <typename T = A>
      typename std::enable_if<!(std::is_same<T, int>::value), void>::type
      fooA(const T & a)
      {
        std::cout << "fooA" << std::endl;
      }
     
      template <typename T = A>
      typename std::enable_if<std::is_same<T, int>::value, void>::type
      fooA(const T & a)
      {
        std::cout << "specialized fooA" << std::endl;
      }
     
      void fooB(const B & b)
      {
        std::cout << "fooB" << std::endl;
      }
      void fooC(const C & c)
      {
        std::cout << "fooC" << std::endl;
      }
    };
     
    int main(int argc, char **argv)
    {
      Test<long, char, char> t1;
      t1.fooA(1l); //fooA 
      t1.fooB('c'); //fooB
      t1.fooC('c'); //fooC
     
      Test<int, char, char> t2;
      t2.fooA(1);  //specialized fooA
      t2.fooB('c'); // fooB
      t2.fooC('c'); // fooC
     
      Test<int, int, int> t3;
      t3.fooA(1); //specialized fooA
      t3.fooB(1); //fooB
      t3.fooC(1); //fooC
    }

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

Discussions similaires

  1. Spécialisation partielle de template template
    Par oodini dans le forum Langage
    Réponses: 2
    Dernier message: 12/03/2012, 18h40
  2. [Template] Spécialisation partielle d'un template
    Par Kurisu dans le forum Langage
    Réponses: 31
    Dernier message: 25/11/2008, 22h21
  3. [Template] spécialisation partielle des template
    Par vikki dans le forum Langage
    Réponses: 9
    Dernier message: 10/11/2008, 16h29
  4. Réponses: 4
    Dernier message: 15/10/2008, 09h33
  5. Réponses: 4
    Dernier message: 04/09/2008, 10h58

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