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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 : 51
    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. 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