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

MFC Discussion :

D�rivation de classe template en visual c++ 2003


Sujet :

MFC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par d�faut D�rivation de classe template en visual c++ 2003
    Bonjour,

    Voici mon probl�me.
    J'ai une classe template (simplifi�e � l'extr�me pour l'exemple):

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    public:
    template <class S> class RequestProcessor {
      RequestProcessor();
      virtual ~RequestProcessor();
    };
    Voici l'impl�mentation :

    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
     
    #include "stdafx.h"
    #include "RequestProcessor.h"
     
    //////////////////////////////////////////////////////////////////////
     
    template <class S> 
    RequestProcessor<S>::RequestProcessor()
    {
    }
     
    //////////////////////////////////////////////////////////////////////
     
    template <class S> 
    RequestProcessor<S>::~RequestProcessor()
    {
    }
    Une classe d�riv�e :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include "market\RequestProcessor.h"
     
    class ContractInfoProcessor : public RequestProcessor<char>
    {
    public:
      ContractInfoProcessor(void);
      virtual ~ContractInfoProcessor(void);
    };
    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
     
    #include "StdAfx.h"
     
    #include "ContractInfoProcessor.h"
     
    //////////////////////////////////////////////////////////////////////
     
    ContractInfoProcessor::ContractInfoProcessor(void)
    {
    }
     
    //////////////////////////////////////////////////////////////////////
     
    ContractInfoProcessor::~ContractInfoProcessor(void)
    {
    }
    A la compilation :

    ContractInfoProcessor.obj : error LNK2019: symbole externe non r�solu "public: __thiscall RequestProcessor<char>::RequestProcessor<char>(void)" (??0?$RequestProcessor@D@@QAE@XZ) r�f�renc� dans la fonction "public: __thiscall ContractInfoProcessor::ContractInfoProcessor(void)" (??0ContractInfoProcessor@@QAE@XZ)
    ContractInfoProcessor.obj : error LNK2019: symbole externe non r�solu "public: virtual __thiscall RequestProcessor<char>::~RequestProcessor<char>(void)" (??1?$RequestProcessor@D@@UAE@XZ) r�f�renc� dans la fonction "public: virtual __thiscall ContractInfoProcessor::~ContractInfoProcessor(void)" (??1ContractInfoProcessor@@UAE@XZ)



    Avez-vous une id�e ?

    Merci

  2. #2
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    salut ,dans la classe de base tu n'as pas mis void dans le constructeur.
    dans la classe deriv�e tu n'appels pas le constructeur de la classe de base.

  3. #3
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par d�faut
    Salut farscape,

    Je viens de rajouter void, pour voir, dans le constructeur et le destructeur de la classe Template, ca n'a rien chang�.

    De plus, je suis a peu pr�s sur que c'est une syntaxe �quivalente.

  4. #4
    R�dacteur
    Avatar de farscape
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par d�faut
    void dans le destructeur ne sert a rien .
    enleve le pour voir ./
    de plus je mettrais la definition de la classe template dans son .h et pas dans un cpp.

  5. #5
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3

  6. #6
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par d�faut
    Merci beaucoup Aur�lien, effectivement ca marche !

    Je n'ai pas r�ussi � mettre dans deux fichiers s�par�s comme propos� par la faq (probl�me d'en-t�te pr�compil�e), mais dans le m�me fichier, ca compile !

    Par contre la faq n'explique pas pourquoi cette n�cessit� ? Est-ce-que tu saurais ?

    C'est toujours interessant de comprendre ...

  7. #7
    Expert confirm�

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par d�faut
    Une version modifi�e de cette r�ponse d�taille plus, elle sera mise en ligne dans quelques jours. La voici:
    Le standard C++ permet de s�parer la d�claration d'une classe/fonction template de son impl�mentation au moyen du mot-cl� export. En th�orie, il est donc possible de d�clarer sa classe/fonction template dans un fichier .h, et de l'impl�menter dans un .cpp, comme on le fait traditionnelement avec les fonctions/classes non template. Mais en pratique, c'est une fonctionnalit� si complexe � r�aliser que seul (� ce jour) quelques compilateurs bas�s sur le front-end d'EDG impl�mentent (Comeau, Intel, ...). Qui plus est, il s'agit d'une fonctionnalit� du langage contrevers�e dont le maitient dans la prochaine norme est d�battu. On peut donc consid�rer que m�me lorsque c'est possible, il n'est pas raisonnable de s�parer l'impl�mentation d'un template de sa d�claration dans l'�tat actuel des choses. Autrement dit, tout son code doit figurer dans le .h.
    On peut cependant conserver la logique de la s�paration interface/impl�mentation en la simulant de cette mani�re:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // exemple.h
    #ifndef EXEMPLE_H
    #define EXEMPLE_H
     
    template <typename T>
    class Exemple
    {
    public:
        Exemple();
    };
     
    #include "exemple.tpp" // <-- astuce ici !!!
    #endif
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    // exemple.tpp
    template <typename T>
    Exemple<T>::Exemple()
    {
    }
    L'astuce consiste � inclure � la fin du .h le fichier contenant le corps du template.
    Notez l'utilisation de l'extension .tpp au lieu du classique .cpp afin de faire la distinction avec les fichiers cpp classiques (pouvant �tre compil�s, contrairement au code template qui doit d'abord �tre sp�cialis� avant de pouvoir �tre compil�). Il n'y a pas vraiment de convension, on trouve de nombreuses autres extensions : .htt, .tcc, .tpl, ... Libre � vous de choisir celle que vous pr�f�rez.
    Note : plut�t que d'�diter ton titre en "r�gl�", clic simplement sur le bouton r�solu

  8. #8
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    14
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Par d�faut
    c'est not�, je suis un peu nouveau ici

Discussions similaires

  1. D�rivation de classe template == using � gogo
    Par Captain'Flam dans le forum D�buter
    R�ponses: 1
    Dernier message: 21/01/2015, 15h22
  2. R�ponses: 2
    Dernier message: 19/03/2010, 09h55
  3. Probleme avec debuggeur Visual Net 2003
    Par 0xYg3n3 dans le forum MFC
    R�ponses: 8
    Dernier message: 15/05/2005, 22h11
  4. R�ponses: 4
    Dernier message: 31/03/2005, 17h55
  5. R�ponses: 6
    Dernier message: 06/10/2004, 12h59

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