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

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 9
    Points
    9
    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
    Points : 17 323
    Points
    17 323
    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
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 9
    Points
    9
    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
    Points : 17 323
    Points
    17 323
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 716
    Points
    10 716
    Billets dans le blog
    3

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 9
    Points
    9
    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 éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 716
    Points
    10 716
    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
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 9
    Points
    9
    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, 16h22
  2. Réponses: 2
    Dernier message: 19/03/2010, 10h55
  3. Probleme avec debuggeur Visual Net 2003
    Par 0xYg3n3 dans le forum MFC
    Réponses: 8
    Dernier message: 15/05/2005, 23h11
  4. Réponses: 4
    Dernier message: 31/03/2005, 18h55
  5. Réponses: 6
    Dernier message: 06/10/2004, 13h59

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