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 régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    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 ?

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Points : 88
    Points
    88
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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 é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
    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