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 d'une méthode de classe


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par défaut Spécialisation partielle d'une méthode de classe
    Bonjour,

    J'ai une question pour les fans de templates, mais tout d'abord, voici le code qui illustrera la question :

    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
    #include <iostream>
    #include <string>
     
    template<typename T1, typename T2>
    class A
    {
    public:
      void f();
      template <typename T3> void g();
    };
     
    template< typename T1, typename T2 >
    void A<T1, T2>::f()
    {
    	g<T1>();
    }
     
    // spécialisation pour T1 = int
    template< typename T1, typename T2 >
    template<>
    void A<T1, T2>::g<int>()
    {
    	std::cout << 24 << std::endl;
    }
     
    int main()
    {
    	A<int, std::string> a;
    	a.f();
    	return 0;
    }
    J'ai donc une classe qui a deux paramètres templates. Dans cette classe, la méthode g() a un comportement spécifique en fonction du premier paramètre, indépendemment du second.

    J'avais tout d'abord pensé à spécialiser partiellement la méthode avec un truc du genre ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T2>
    void A<int, T2>::g() { ... }
    mais ce n'est pas autorisé. Alors j'ai écrit le code placé plus haut, en me disant que j'allais paramétrer la méthode g() pour ensuite la spécialiser ; mais là encore, le compilateur fait la tête :

    Citation Envoyé par g++
    test_template.cpp:20: erreur: invalid explicit specialization before ‘>’ token
    test_template.cpp:20: erreur: fermetures de patrons de classe ne sont pas explicitement spécialisées
    test_template.cpp:21: erreur: template-id ‘g<int>’ for ‘void A<T1, T2>::g()’ does not match any template declaration
    test_template.cpp:21: erreur: déclaration de fonction invalide
    Je crois comprendre qu'il ne veut pas que je spécialise une méthode d'une classe template si je ne spécialise pas la classe elle-même.

    Alors maintenant je suis un peu à court d'idées, je m'en remet donc à vous. Avez-vous une idée pour m'aider à obtenir ce que je veux ?

    Merci

  2. #2
    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
    On ne peut pas faire de spécialisation partielle de fonction.

    Dans ton exemple, j'ai un peu l'impression que le plus simple est de faire de g une fonction ne faisant pas partie de A. Me trompe-je ?
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par défaut
    Citation Envoyé par JolyLoic
    Dans ton exemple, j'ai un peu l'impression que le plus simple est de faire de g une fonction ne faisant pas partie de A. Me trompe-je ?
    Dans l'exemple, oui, mais dans la réalité la méthode g() a besoin de modifier des membres de la classe.

    En fait j'ai réussi à m'en passer parce que, finalement, la structure des classes a un peu changée. Mais je laisse quand même le post pour voir vos idées.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans l'exemple, oui, mais dans la réalité la méthode g() a besoin de modifier des membres de la classe
    Dans ce cas tu peux mixer les deux solutions : garder une fonction membre g(), qui ne ferait qu'appeler une fonction amie prenant en paramètre une référence sur l'instance de la classe.

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par JolyLoic
    On ne peut pas faire de spécialisation partielle de fonction.
    Mais on peut surcharger ce qui permet souvent -- mais pas toujours -- d'avoir l'effet désiré.

Discussions similaires

  1. Pb avec une méthode de classe
    Par damien27000 dans le forum Langage
    Réponses: 5
    Dernier message: 29/08/2007, 17h50
  2. Réponses: 5
    Dernier message: 15/05/2007, 20h51
  3. override partiel dans une méthode dérivée
    Par cyberchand dans le forum C#
    Réponses: 2
    Dernier message: 17/04/2007, 10h34
  4. Réponses: 3
    Dernier message: 02/01/2007, 13h53
  5. [C#] Ajout d'une méthode à la classe DropDownList
    Par Scorff dans le forum ASP.NET
    Réponses: 2
    Dernier message: 30/08/2005, 14h23

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