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 :

Utilisation des templates [FAQ]


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 Utilisation des templates
    Bonjour à tous,

    J'ai décidé d'utiliser les templates pour créer une classe super générique.

    Mais j'ai un soucis au niveau de la compilation. Voici l'erreur
    Compiling...
    DockViewBar.cpp
    D:\DEV_ROOT\Lib\ControlsLib\DockViewBar.cpp(31) : error C2955: 'CDockViewBar' : use of class template requires template argument list
    d:\dev_root\lib\controlslib\dockviewbar.h(47) : see declaration of 'CDockViewBar'
    D:\DEV_ROOT\Lib\ControlsLib\DockViewBar.cpp(31) : error C2955: 'CDockViewBar' : use of class template requires template argument list
    d:\dev_root\lib\controlslib\dockviewbar.h(47) : see declaration of 'CDockViewBar'
    Je comprend bien le message d'erreur. Il faut que je mette un template <class TPL_VIEW>, mais le compilateur ne veux rien savoir.

    Voici le code de ma petite classe:
    DockViewBar.h
    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
    #if !defined&#40;AFX_DOCKVIEWBAR_H__A00CEEA4_3F10_4794_A834_82C511FA6DC9__INCLUDED_&#41;
    #define AFX_DOCKVIEWBAR_H__A00CEEA4_3F10_4794_A834_82C511FA6DC9__INCLUDED_
     
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // DockViewBar.h &#58; header file
    //
     
    /////////////////////////////////////////////////////////////////////////////
    // CDockViewBar window
     
    template <class TPL_VIEW>
    class CDockViewBar &#58; public baseCDockViewBar
    &#123;
    // Construction
    public&#58;
    	CDockViewBar&#40;CCreateContext* pContext =NULL&#41;;
     
    // Attributes
    public&#58;
     
    // Operations
    public&#58;
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//&#123;&#123;AFX_VIRTUAL&#40;CPageSettingFieldsBar&#41;
    	//&#125;&#125;AFX_VIRTUAL
     
    // Implementation
    public&#58;
    	CCreateContext * GetCreateContext &#40; &#41;;
    	virtual ~CDockViewBar&#40;&#41;;
     
    	// Generated message map functions
    protected&#58;
    	TPL_VIEW		 * m_pView;
    	CCreateContext   * m_pContext;
     
    	virtual void OnUpdateCmdUI&#40;CFrameWnd* pTarget, BOOL bDisableIfNoHndler&#41;;
     
    	//&#123;&#123;AFX_MSG&#40;CPageSettingFieldsBar&#41;
    	afx_msg int OnCreate&#40;LPCREATESTRUCT lpCreateStruct&#41;;
    	//&#125;&#125;AFX_MSG
    	DECLARE_MESSAGE_MAP&#40;&#41;
    &#125;;
     
    #endif //AFX_DOCKVIEWBAR_H__A00CEEA4_3F10_4794_A834_82C511FA6DC9__INCLUDED_
    DockViewBar.cpp
    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
    // DockViewBar.cpp &#58; implementation file
    //
     
    #include "stdafx.h"
     
    #include "DockViewBar.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE&#91;&#93; = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CDockViewBar
    template <class TPL_VIEW>
    CDockViewBar<TPL_VIEW>&#58;&#58;CDockViewBar&#40;CCreateContext* pContext /* =NULL*/ &#41;
    &#123;
        m_pContext = pContext;
     
    	// Création de la vue en outrepassant le constructeur "protected"
        CRuntimeClass* pFactory = RUNTIME_CLASS&#40;TPL_VIEW&#41;;
        m_pView = pFactory->CreateObject &#40; &#41;;
    &#125;
     
     
    template <class TPL_VIEW>
    CDockViewBar<TPL_VIEW>&#58;&#58;~CDockViewBar&#40;&#41;
    &#123;
    &#125;
     
     
    BEGIN_MESSAGE_MAP&#40;CDockViewBar, baseCDockViewBar&#41;
    	//&#123;&#123;AFX_MSG_MAP&#40;CDockViewBar&#41;
    	ON_WM_CREATE&#40;&#41;
    	//&#125;&#125;AFX_MSG_MAP
    END_MESSAGE_MAP&#40;&#41;
     
     
    /////////////////////////////////////////////////////////////////////////////
    // CDockViewBar message handlers
     
    template <class TPL_VIEW>
    int CDockViewBar<TPL_VIEW>&#58;&#58;OnCreate&#40;LPCREATESTRUCT lpCreateStruct&#41; 
    &#123;
    	if &#40;baseCDockViewBar&#58;&#58;OnCreate&#40;lpCreateStruct&#41; == -1&#41;
    		return -1;
    	SetSCBStyle&#40;GetSCBStyle&#40;&#41; | SCBS_SIZECHILD&#41;;
     
    	if &#40;m_pView &#41;
    	&#123;
    		m_pView->CreateView&#40;this, m_pContext&#41;;
    	&#125;
    	return 0;
    &#125;
     
    template <class TPL_VIEW>
    void CDockViewBar<TPL_VIEW>&#58;&#58;OnUpdateCmdUI&#40;CFrameWnd* pTarget,
                                          BOOL bDisableIfNoHndler&#41;
    &#123;
    	pTarget->ShowControlBar&#40;this,TRUE,FALSE&#41;;
        UNUSED_ALWAYS&#40;bDisableIfNoHndler&#41;;
    &#125;
    A oui autre petit détails qui a son importance. L'erreur se produit sur le
    BEGIN_MESSAGE_MAP(CDockViewBar, baseCDockViewBar)

    Si vous aviez une petite idée, j'avoue que ça m'arrangerai

    Merci d'avance

  2. #2
    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 viens d'essayer ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN_MESSAGE_MAP&#40;CDockViewBar<class TPL_VIEW>, baseCDockViewBar&#41;
    	//&#123;&#123;AFX_MSG_MAP&#40;CDockViewBar&#41;
    	ON_WM_CREATE&#40;&#41;
    	//&#125;&#125;AFX_MSG_MAP
    END_MESSAGE_MAP&#40;&#41;
    et le compilateur ne bloque plus sur le BEGIN_MESSAGE_MAP, mais plus loin.
    Compiling...
    DockViewBar.cpp
    D:\DEV_ROOT\Lib\ControlsLib\DockViewBar.cpp(52) : error C2027: use of undefined type 'TPL_VIEW'
    D:\DEV_ROOT\Lib\ControlsLib\DockViewBar.cpp(33) : see declaration of 'TPL_VIEW'
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'int __thiscall CDockViewBar<class TPL_VIEW>::OnCreate(struct tagCREATESTRUCTA *)'
    D:\DEV_ROOT\Lib\ControlsLib\DockViewBar.cpp(52) : error C2227: left of '->CreateView' must point to class/struct/union
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function 'int __thiscall CDockViewBar<class TPL_VIEW>::OnCreate(struct tagCREATESTRUCTA *)'
    Le problème se situe ensuite sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pView->CreateView&#40;this, m_pContext&#41;;
    Alors j'ai testé en mettant en mettant en commentaire le BEGIN_MESSAGE_MAP, et là tout compile normalement. Mais bon sur le principe c'est con car le OnCreate ne sera pas utilisé.

  3. #3
    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,
    quelle version de vc tu utilises ? (vc6,.Net2003,vc2005)
    tel quel ca ne peut fonctionner.
    j'ai une solution pour vc6.0 ,le probleme est effectivement le begin message map.

  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 suis avec VC6

  5. #5
    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
    Tu as une solution pour la classe en général ou pour le BEGIN_MESSAGE_MAP ?

  6. #6
    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
    re,
    tu mets ça dans un .h
    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
     
    #define DECLARE_TEMPLATE_MESSAGE_MAP&#40;&#41; DECLARE_MESSAGE_MAP&#40;&#41;
     
    #ifdef _AFXDLL
    #define BEGIN_TEMPLATE_MESSAGE_MAP&#40;TemplArg, theClass, baseClass&#41; \
    	template <TemplArg> \
    		const AFX_MSGMAP* PASCAL theClass&#58;&#58;_GetBaseMessageMap&#40;&#41; \
    			&#123; return &baseClass&#58;&#58;messageMap; &#125; \
    	template <TemplArg> \
    		const AFX_MSGMAP* theClass&#58;&#58;GetMessageMap&#40;&#41; const \
    			&#123; return &theClass&#58;&#58;messageMap; &#125; \
    	template <TemplArg> \
    		AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass&#58;&#58;messageMap = \
    		&#123; &theClass&#58;&#58;_GetBaseMessageMap, &theClass&#58;&#58;_messageEntries&#91;0&#93; &#125;; \
    	template <TemplArg> \
    		AFX_COMDAT const AFX_MSGMAP_ENTRY theClass&#58;&#58;_messageEntries&#91;&#93; = \
    		&#123; \
     
    #else
    #define BEGIN_TEMPLATE_MESSAGE_MAP&#40;TemplArg, theClass, baseClass&#41; \
    	template <TemplArg> \
    		const AFX_MSGMAP* theClass&#58;&#58;GetMessageMap&#40;&#41; const \
    			&#123; return &theClass&#58;&#58;messageMap; &#125; \
    	template <TemplArg> \
    		AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass&#58;&#58;messageMap = \
    		&#123; &baseClass&#58;&#58;messageMap, &theClass&#58;&#58;_messageEntries&#91;0&#93; &#125;; \
    	template <TemplArg> \
    		AFX_COMDAT const AFX_MSGMAP_ENTRY theClass&#58;&#58;_messageEntries&#91;&#93; = \
    		&#123; \
     
    #endif
    dans ton .h tu remplace DECLARE_MESSAGE_MAP() par DECLARE_TEMPLATE_MESSAGE_MAP()
    et BEGIN_MESSAGE_MAP tu l'enleve du .cpp pour le mettre dans le .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN_TEMPLATE_MESSAGE_MAP&#40;class baseCDockViewBar, CDockViewBar<TPL_VIEW>,baseCDockViewBar&#41;
    	//&#123;&#123;AFX_MSG_MAP&#40;CDockViewBar&#41;	
    //....
    	//&#125;&#125;AFX_MSG_MAP
    END_TEMPLATE_MESSAGE_MAP&#40;&#41;
    j'ai pas teste ton cas, voila ce que j'avais fais moi avec une autre classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template <class GENERIC_DLGCOLOR = CWnd>
    class CTplDlgColor &#58; public GENERIC_DLGCOLOR
    &#123;
    //...blabla
    DECLARE_TEMPLATE_MESSAGE_MAP&#40;&#41;
    &#125;;
     
    BEGIN_TEMPLATE_MESSAGE_MAP&#40;class GENERIC_DLGCOLOR, CTplDlgColor<GENERIC_DLGCOLOR>, GENERIC_DLGCOLOR&#41;
    	//&#123;&#123;AFX_MSG_MAP&#40;CTplDlgColor&#41;	
    	ON_WM_CTLCOLOR&#40;&#41;
    	//&#125;&#125;AFX_MSG_MAP
    END_TEMPLATE_MESSAGE_MAP&#40;&#41;
    rappel dans le cas d'un template le code doit etre dans le .h sinon ça ne passera pas a la compilation.


  7. #7
    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
    Tu veux dire que tout le code doit être dans un .h

    Le contructeur, OnCreate et tout et tout ?

  8. #8
    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
    oui tout

  9. #9
    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 viens de mettre en place tout ça, et il ne me reste plus qu'un petit soucis.
    2 erreurs de compil, petites mais costo
    d:\dev_root\lib\controlslib\dockviewbar.h(60) : error C2039: 'classTPL_VIEW' : is not a member of 'CModelEditorPropertiesView'
    d:\dev_root\product\win\designer\modeleditorpropertiesview.h(23) : see declaration of 'CModelEditorPropertiesView'
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function '__thiscall CDockViewBar<class CModelEditorPropertiesView>::CDockViewBar<class CModelEditorPropertiesView>(struct CCreateConte
    xt *)'
    d:\dev_root\lib\controlslib\dockviewbar.h(60) : error C2065: 'classTPL_VIEW' : undeclared identifier
    c:\program files\microsoft visual studio\vc98\include\xmemory(59) : while compiling class-template member function '__thiscall CDockViewBar<class CModelEditorPropertiesView>::CDockViewBar<class CModelEditorPropertiesView>(struct CCreateConte
    Et cette erreur se produit sur la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CRuntimeClass* pFactory = RUNTIME_CLASS&#40;TPL_VIEW&#41;;
    Dans le constructeur de CDocViewBar
    Alors que je l'utilise en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	m_pWndTestBar = new CDockViewBar<CModelEditorPropertiesView> &#40;pContext&#41;;
    S'il y a une solution je suis preneur car j'ai testé tout ce que je connaissais. Les include du .h, les "class ...;"

  10. #10
    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, je suis parti sur le même principe que pour le BEGIN_MESSAGE_MAP.
    J'ai cherché le corp de la macro. Et j'ai compris que je ne pourra rien faire.

    Code de la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define RUNTIME_CLASS&#40;class_name&#41; &#40;&#40;CRuntimeClass*&#41;&#40;&class_name&#58;&#58;class##class_name&#41;&#41;
    J'ai donc modifié l'appel du contructeur pour que l'on passe le bon RuntimeClass.

    J'ai donc un appel un peu plus long. Mais au moins ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pwndPropertiesBar = new CDockViewBar<CModelEditorPropertiesView> &#40;pContext, RUNTIME_CLASS &#40;CModelEditorPropertiesView&#41; &#41;;
    En tout cas, merci Farscape pour ton aide.

  11. #11
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Supposition bête : si le compilo te sort un 'classTPL_VIEW', ce ne serait pas parce que quelque part tu as écrit 'classTPL_VIEW' au lieu de 'class TPL_VIEW' ?

  12. #12
    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
    Non en fait, il faut regarder dans la macro RUNTIME_CLASS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define RUNTIME_CLASS&#40;class_name&#41; &#40;&#40;CRuntimeClass*&#41;&#40;&class_name&#58;&#58;class##class_name&#41;&#41;
    Dans un cas normal, la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RUNTIME_CLASS &#40;CAge&#41;;
    revient à ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &#40;&#40;CRuntimeClass*&#41;&#40;&class_name&#58;&#58;classCAge&#41;&#41;
    Sachant que classCAge est créé par la macro DECLARE_DYNCREATE

    Donc si je fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RUNTIME_CLASS &#40; TPL_VIEW &#41;;
    le compilateur remplace d'abord les macros et gère ensuite les templates
    Donc on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &#40;&#40;CRuntimeClass*&#41;&#40;&class_name&#58;&#58;classTPL_VIEW&#41;&#41;

  13. #13
    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,

    Je viens de faire un test sous Visual 2005 et j'ai réussi à faire passer la macro que tu m'avais donné.

    Cependant il y a quelques changement dans la déclaration.
    Ce bout de code permet d'avoir en même temps la compatabilité avec VC6 VC2005.

    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #ifndef BEGIN_TEMPLATE_MESSAGE_MAP
    #ifdef _AFXDLL
    #define BEGIN_TEMPLATE_MESSAGE_MAP(TemplArg, theClass, baseClass) \
       template <class type_name> \
          const AFX_MSGMAP* PASCAL theClass < type_name >::_GetBaseMessageMap() \
             { return &baseClass::messageMap; } \
       template <class type_name> \
          const AFX_MSGMAP* theClass < type_name >::GetMessageMap() const \
             { return &theClass < type_name >::messageMap; } \
       template <class type_name> \
          AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass < type_name >::messageMap = \
          { &theClass < type_name >::_GetBaseMessageMap, &theClass < type_name >::_messageEntries[0] }; \
       template <class type_name> \
          AFX_COMDAT const AFX_MSGMAP_ENTRY theClass < type_name >::_messageEntries[] = \
          { \
     
    #else
    #define BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass) \
       template <class type_name> \
          const AFX_MSGMAP* theClass < type_name >::GetMessageMap() const \
             { return &theClass < type_name >::messageMap; } \
       template <class type_name> \
          AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass < type_name >::messageMap = \
          { &baseClass::messageMap, &theClass < type_name >::_messageEntries[0] }; \
       template <class type_name> \
          AFX_COMDAT const AFX_MSGMAP_ENTRY theClass < type_name >::_messageEntries[] = \
          { \
     
    #endif 
    #endif
    Ancienne déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEGIN_TEMPLATE_MESSAGE_MAP(class T_GE_FrameWnd, CGraphicEditorFrame<T_GE_FrameWnd>, T_GE_FrameWnd)
    Nouvelle déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEGIN_TEMPLATE_MESSAGE_MAP(CGraphicEditorFrame, T_GE_FrameWnd, T_GE_FrameWnd)
    La nouvelle déclaration est quand même plus simple

  14. #14
    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
    pfffui tu nous a ressorti un vieux post de derrière les fagots

  15. #15
    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
    C'est la moindre chose.

    Après tout c'est à ça que sert ce forum. Surtout quand je pose des questions assez chiante dans le genre.

  16. #16
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Salut Vanitom,

    Si cela peut te rassurer, tu n'es pas le seul à poser des questions chiantes... Je viens de poser à peu près la même !

    En tout cas, merci pour tes précisions, que je vais tester sans tarder !

  17. #17
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Citation Envoyé par vanitom
    Salut,

    Je viens de faire un test sous Visual 2005 et j'ai réussi à faire passer la macro que tu m'avais donné.

    Cependant il y a quelques changement dans la déclaration.
    Ce bout de code permet d'avoir en même temps la compatabilité avec VC6 VC2005.

    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #ifndef BEGIN_TEMPLATE_MESSAGE_MAP
    #ifdef _AFXDLL
    #define BEGIN_TEMPLATE_MESSAGE_MAP(TemplArg, theClass, baseClass) \
       template <class type_name> \
          const AFX_MSGMAP* PASCAL theClass < type_name >::_GetBaseMessageMap() \
             { return &baseClass::messageMap; } \
       template <class type_name> \
          const AFX_MSGMAP* theClass < type_name >::GetMessageMap() const \
             { return &theClass < type_name >::messageMap; } \
       template <class type_name> \
          AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass < type_name >::messageMap = \
          { &theClass < type_name >::_GetBaseMessageMap, &theClass < type_name >::_messageEntries[0] }; \
       template <class type_name> \
          AFX_COMDAT const AFX_MSGMAP_ENTRY theClass < type_name >::_messageEntries[] = \
          { \
     
    #else
    #define BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass) \
       template <class type_name> \
          const AFX_MSGMAP* theClass < type_name >::GetMessageMap() const \
             { return &theClass < type_name >::messageMap; } \
       template <class type_name> \
          AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass < type_name >::messageMap = \
          { &baseClass::messageMap, &theClass < type_name >::_messageEntries[0] }; \
       template <class type_name> \
          AFX_COMDAT const AFX_MSGMAP_ENTRY theClass < type_name >::_messageEntries[] = \
          { \
     
    #endif 
    #endif
    J'ai recopié exatement la déclaration que tu proposes, Vanitom, mais mon compilateur VS 2005 ne l'a pas aimée. Il m'a sorti une erreur fatale comme quoi il avait rencontré une fin de fichier inattendue (ou un truc dans ce genre là).
    Mais je me suis ensuite rendu compte que la macro BEGIN_TEMPLATE_MESSAGE_MAP existait déjà dans la version 2005, dans le fichier afxwin.h. Je la recopie ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass) \
    	PTM_WARNING_DISABLE \
    	template < typename type_name > \
    	const AFX_MSGMAP* theClass< type_name >::GetMessageMap() const \
    		{ return GetThisMessageMap(); } \
    	template < typename type_name > \
    	const AFX_MSGMAP* PASCAL theClass< type_name >::GetThisMessageMap() \
    	{ \
    		typedef theClass< type_name > ThisClass; \
    		typedef baseClass TheBaseClass; \
    		static const AFX_MSGMAP_ENTRY _messageEntries[] = \
    		{
    Et ça marche très bien avec cette définition là !

  18. #18
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Rectification : ça ne marche pas si bien que ça... Je ne peux pas rajouter ON_WM_CLOSE() sous peine de faire râler le compilateur.

  19. #19
    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
    Bon là je n'ai pas eu le temps de tester mais normalement le #ifndef BEGIN_TEMPLATE_MESSAGE_MAP permet de vérifier que la macro existe ou pas. Donc si on est sous VC2005 ou pas.

    En fait normalement sous visual 2005, il n'y a pas de code à rajouter. De marco, le code que j'ai donné c'est pour que mon code fonctionne à la fois sous VC6 et VC2005.

    Donc si t'es uniquement sous VC2005 tu n'as aucune macro à mettre.


    Sinon pour ton problème, je n'ai jamais eu de telle problème.
    Désolé

  20. #20
    Membre éclairé
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 749
    Points
    749
    Par défaut
    Oui, je sais bien que le #ifndef permet de définir la macro si elle n'existe pas déjà. Il n'empêche que mon compilateur 2005 n'a pas aimé la définition de la macro.

    Pour mon problème, ce n'est pas grave car j'ai mis le code que je voulais exécuter à la fermeture de la boîte de dialogue dans la méthode DestroyWindow. Et là, ça marche...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utilisation des templates de styles (jrtx)
    Par tnodev dans le forum Jasper
    Réponses: 2
    Dernier message: 12/11/2007, 16h19
  2. [OpenTBS] Utilisation des templates
    Par fdumont dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/02/2007, 23h43
  3. Réponses: 7
    Dernier message: 13/02/2007, 16h09
  4. [XSL] utilisation des templates
    Par KibitO dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 16/12/2005, 16h54
  5. Utilisation des templates
    Par mikky dans le forum C++
    Réponses: 1
    Dernier message: 14/09/2005, 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