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 :

Utiliser des templates avec la macro DECLARE_DYNCREATE


Sujet :

MFC

  1. #1
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut Utiliser des templates avec la macro DECLARE_DYNCREATE
    Bonjour,


    J'utilise un template avec une classe neccessitant obligatoirement un DECLARE_DYNACREATE

    J'ai suivi les conseils de Frascape et modifiant le contenu de la macro DECLARE_DYNCREATE mais rien n'y fait. J'ai toujours des erreurs

    Voici le code de la nouvelle macro :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define IMPLEMENT_TEMPLATE_RUNTIMECLASS(TemplArg, class_name, base_class_name, wSchema, pfnNew) \
    	template <TemplArg> \
    		AFX_COMDAT const AFX_DATADEF CRuntimeClass class_name::class##class_name = { \
    		#class_name, sizeof(class class_name), wSchema, pfnNew, \
    			RUNTIME_CLASS(base_class_name), NULL }; \
    	template <TemplArg> \
    		CRuntimeClass* class_name::GetRuntimeClass() const \
    		{ return RUNTIME_CLASS(class_name); } \
    #define IMPLEMENT_TEMPLATE_DYNCREATE(TemplArg, class_name, base_class_name) \
    	template <TemplArg> \
    		CObject* PASCAL class_name::CreateObject() \
    			{ return new class_name; } \
    	IMPLEMENT_TEMPLATE_RUNTIMECLASS(TemplArg, class_name, base_class_name, 0xFFFF, \
    		class_name::CreateObject)
    Mais en l'utilisant comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMPLEMENT_TEMPLATE_DYNCREATE (class T_GEFrameWnd, CGraphicEditorFrame<T_GEFrameWnd>, T_GEFrameWnd)
    j'ai les erreurs suivantes que je ne comprend définitivement pas.
    error C2143: syntax error : missing ';' before '<'
    error C2059: syntax error : ';'
    error C2143: syntax error : missing ';' before '<'
    Je me suis même amusé à reprendre le code de macro pour les remettre dans mon code à moi. Et pareil mais je ne comprend pas le problème, dont voici le code après la conversion manuelle des instructions du preprocesseur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T_GEFrameWnd>
    CRuntimeClass* CGraphicEditorFrame<T_GEFrameWnd>::GetRuntimeClass() const { return RUNTIME_CLASS(CGraphicEditorFrame<T_GEFrameWnd>); }
     
    template <class T_GEFrameWnd>
    AFX_COMDAT const AFX_DATADEF 
    CRuntimeClass CGraphicEditorFrame<T_GEFrameWnd>::classCGraphicEditorFrame<T_GEFrameWnd> = 
    { 
    	"CGraphicEditorFrame<T_GEFrameWnd>",
    	sizeof(class CGraphicEditorFrame<T_GEFrameWnd>), 
    	wSchema, pfnNew, RUNTIME_CLASS(T_GEFrameWnd), NULL
    };
    Donc si quelq'un avait une piste j'ai tout épuisé.

    Merci d'avance

  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,
    avec quel compilateur tu travailles v60 ? VC2005 ?

  3. #3
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Salut

    Franchement oublier juste cette info c'est pas cool.
    Je compile avec VC6

  4. #4
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Je m'y suis remis et j'ai comme l'impression que c'est impossible.

    Je commence à y aller sans passer par les macro et j'ai de problème avec le IMPLEMENT_RUNTIME_CLASS. C'est dû au commande de précompilation.

    Je ne vois conciler les commandes de précompilation et les templates.

    Voici le code de RuntimeClass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define RUNTIME_CLASS ( class_name ) ((CRuntimeClass*)(&class_name::class##class_name))
    En remplacant les variables de la macro et les commande de précompilation, j'obtiens ça et c'est pas du tout logique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((CRuntimeClass*)(&T_FrameWnd::classT_FrameWnd)
    Alors maintenant je crois que je suis dans une impasse.

  5. #5
    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
    pourtant dans un de mes posts ou j'ai evoqué ce sujet ,ça fonctionnait justement tres bien pour visual 6.0 et etait problematique sous vc2005 a cause des templates justement..

  6. #6
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    Alors premièrement, j'ai trouvé un autre moyen pour éviter d'utilser des templates avec des macros.


    Par contre, on ne va tarder à passer sous VC2005 et tes anciennes macros ne pas plus, il va falloir que je mette le pif dedans.


    Apparement ils ont commencé à la faire la macro en question mais pas exactement comme je le voulais. Ils font un
    template < typename ... > et pas un template < class ... >

    Mais bon maintenant que je sais ou chercher je trouverai bien une solution.

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    1-je ne comprends vraiment pas l'intérêt d'utiliser DECLARE_DYNCREATE avec des templates.
    On utilise en général cette macro avec CArray<> par exemple ou toutes les autres collections d'objets ( comme CObList,CList etc...)
    2-est-ce que T_GEFrameWnd hérite bien de CObject dans la définition de la classe ?

  8. #8
    Membre régulier Avatar de vanitom
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 327
    Points : 85
    Points
    85
    Par défaut
    En fait les Template ne servent pas uniquement pour le collections d'objets. Ils servent aussi pour ajouter des fonctions très spécifiques et communes à plusieurs classes. Mais sans forcement intervenir dans l'héritage.
    Le problème des templates est leurs complexités et également qu'il n'est ABSOLUMENT pas possible de modifier ou de surcharger une fonction contenue dans le template. D'où une rigidité extrème.

    Et donc maintenant je dois ajouter une fonction spécifique à une CFrameWnd. Et quand on utilise la gestion Document/Frame/View, les frames doivent être créer avec cette macro la. Cette macro permet au CDocTemplate de faire une CreateObject à partir du RuntimeClass de la frame.

    Oui T_GEFrameWnd dérive de CObject. T_GEFrameWnd doit obligatoirement être dérivé d'une CFrameWnd.

Discussions similaires

  1. Utilisation des champs avec macro
    Par PAM0306 dans le forum VBA Word
    Réponses: 1
    Dernier message: 17/10/2008, 17h22
  2. utilisation des templates avec javaMail
    Par bousnguar dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 12/09/2008, 15h42
  3. Utilisation des templates
    Par vanitom dans le forum MFC
    Réponses: 21
    Dernier message: 01/08/2007, 11h07
  4. [XSL] utilisation des templates
    Par KibitO dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/12/2005, 15h54
  5. Utilisation des templates
    Par mikky dans le forum C++
    Réponses: 1
    Dernier message: 14/09/2005, 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