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 :

Fonction Template dans une classe & Héritage


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut Fonction Template dans une classe & Héritage
    Bonjour,

    J'essaye actuellement de résoudre un problème un peu dans la même veine que "type erasure" via l'utilisation de template spécialisé uniquement dans des classes filles.

    Seulement lors de la compilation sous Visual Studio 2008, je rencontre une erreur de compilation :
    error C2912: explicit specialization; 'bool A::ISEqual(const A *) const' is not a specialization of a function template
    L'erreur est provoquée parce dans la classe A, je n'ai pas redéfini la fonction template généraliste qui , je le pensais, devrait être héritée de IParent.

    Voici un code source qui exhibe le problème :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
     
    struct IParent 
    {
     
    public :
    	enum EType
    	{
    		eA,
    		eB
    	};
     
    	IParent(EType p_eType):m_eType(p_eType){};
     
    	EType GetType() const { return m_eType ;} ;
     
     
    	template<class T> 
    	bool ISEqual(const T* p_Param)  const
    	{ 
    		return false ;
    	};
     
    protected : 
    	EType m_eType ;
     
    };
     
     
     
    struct A : public IParent
    {
    	A():IParent(eA){};
     
    	/*
    	template<class T> 
    	bool ISEqual(const T* p_Param)  const
    	{ 
    		return false ;
    	};
    */
    	template<>
    	bool ISEqual<A>(const A* p_Param) const 
    	{
    		return true;
    	};
     
    	template<> 
    	bool ISEqual<IParent> (const IParent* p_Param) const
    	{
    		return m_eType == p_Param->GetType();
    	};
    };
     
     
     
    struct B : public IParent
    {
    	B():IParent(eB){};
     
    	template<class T> 
    	bool ISEqual(const T* p_Param)  const
    	{ 
    		return false ;
    	};
     
    	template<>
    	bool ISEqual<B>(const B* p_Param) const
    	{
    		return true ;
    	};
     
    	template<> 
    	bool ISEqual<IParent> (const IParent* p_Param) const
    	{
    		return m_eType == p_Param->GetType();
    	};
     
    };
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	A a ;
    	A a2 ;
    	B b ;
    	B b2 ;
    	IParent* a3 = new A();
    	IParent* b3 = new B();
     
    	char c ;
     
    	cout<<"a1 == a2 ? "<<a.ISEqual(&a2)<<endl;
    	cout<<"b1 == b2 ? "<<b.ISEqual(&b2)<<endl;
    	cout<<"a1 == b2 ? "<<a.ISEqual(&b2)<<endl;
    	cout<<"a1 == IPb3 ?"<<a.ISEqual(b3)<<endl;
    	cout<<"a1 == IPa3 ?"<<a.ISEqual(a3)<<endl;
            cout<<"IPA3 == a1 ?"<<a3->ISEqual(&a)<<endl;
     
    	cin>>c ;
     
    	delete b3 ;
            delete a3;
     
    	return 0;
    }
    Ma question est : Pourquoi faut-il redéfinir la fonction template IsEgal généraliste dans chaque classe fille ?

    Ps : j'ai zyeuté la FAQ mais soit je suis passé à côté, soit j'ai rien trouvé là dessus.

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Si tu faisais dans la classe mère et dans la classe fille deux méthodes qui ont le même nom, il ne verrait pas le lien entre les deux (sauf si tu utilises virtual, mais là, ça se fait en dynamique). Pourquoi veut-il qu'il le fasse dans le cas présenté ?

    Peut-être faut-il passer par le CRTP...

Discussions similaires

  1. Spécialisation de fonction template dans une class template
    Par summerstorm dans le forum Langage
    Réponses: 6
    Dernier message: 05/01/2010, 20h15
  2. Réponses: 9
    Dernier message: 05/01/2010, 08h32
  3. Fonction template dans une classe template
    Par mister3957 dans le forum Langage
    Réponses: 9
    Dernier message: 08/07/2008, 12h11
  4. fonction static dans une class
    Par Stany dans le forum C++
    Réponses: 3
    Dernier message: 16/06/2006, 14h43
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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