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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� 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
    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(AFX_DOCKVIEWBAR_H__A00CEEA4_3F10_4794_A834_82C511FA6DC9__INCLUDED_)
    #define AFX_DOCKVIEWBAR_H__A00CEEA4_3F10_4794_A834_82C511FA6DC9__INCLUDED_
     
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // DockViewBar.h : header file
    //
     
    /////////////////////////////////////////////////////////////////////////////
    // CDockViewBar window
     
    template <class TPL_VIEW>
    class CDockViewBar : public baseCDockViewBar
    {
    // Construction
    public:
    	CDockViewBar(CCreateContext* pContext =NULL);
     
    // Attributes
    public:
     
    // Operations
    public:
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CPageSettingFieldsBar)
    	//}}AFX_VIRTUAL
     
    // Implementation
    public:
    	CCreateContext * GetCreateContext ( );
    	virtual ~CDockViewBar();
     
    	// Generated message map functions
    protected:
    	TPL_VIEW		 * m_pView;
    	CCreateContext   * m_pContext;
     
    	virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
     
    	//{{AFX_MSG(CPageSettingFieldsBar)
    	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
     
    #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 : implementation file
    //
     
    #include "stdafx.h"
     
    #include "DockViewBar.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
     
    /////////////////////////////////////////////////////////////////////////////
    // CDockViewBar
    template <class TPL_VIEW>
    CDockViewBar<TPL_VIEW>::CDockViewBar(CCreateContext* pContext /* =NULL*/ )
    {
        m_pContext = pContext;
     
    	// Création de la vue en outrepassant le constructeur "protected"
        CRuntimeClass* pFactory = RUNTIME_CLASS(TPL_VIEW);
        m_pView = pFactory->CreateObject ( );
    }
     
     
    template <class TPL_VIEW>
    CDockViewBar<TPL_VIEW>::~CDockViewBar()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CDockViewBar, baseCDockViewBar)
    	//{{AFX_MSG_MAP(CDockViewBar)
    	ON_WM_CREATE()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
     
    /////////////////////////////////////////////////////////////////////////////
    // CDockViewBar message handlers
     
    template <class TPL_VIEW>
    int CDockViewBar<TPL_VIEW>::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    	if (baseCDockViewBar::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	SetSCBStyle(GetSCBStyle() | SCBS_SIZECHILD);
     
    	if (m_pView )
    	{
    		m_pView->CreateView(this, m_pContext);
    	}
    	return 0;
    }
     
    template <class TPL_VIEW>
    void CDockViewBar<TPL_VIEW>::OnUpdateCmdUI(CFrameWnd* pTarget,
                                          BOOL bDisableIfNoHndler)
    {
    	pTarget->ShowControlBar(this,TRUE,FALSE);
        UNUSED_ALWAYS(bDisableIfNoHndler);
    }
    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 �clair� 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
    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(CDockViewBar<class TPL_VIEW>, baseCDockViewBar)
    	//{{AFX_MSG_MAP(CDockViewBar)
    	ON_WM_CREATE()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    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(this, m_pContext);
    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
    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 �clair� 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
    Par d�faut
    Je suis avec VC6

  5. #5
    Membre �clair� 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
    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
    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() DECLARE_MESSAGE_MAP()
     
    #ifdef _AFXDLL
    #define BEGIN_TEMPLATE_MESSAGE_MAP(TemplArg, theClass, baseClass) \
    	template <TemplArg> \
    		const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \
    			{ return &baseClass::messageMap; } \
    	template <TemplArg> \
    		const AFX_MSGMAP* theClass::GetMessageMap() const \
    			{ return &theClass::messageMap; } \
    	template <TemplArg> \
    		AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
    		{ &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \
    	template <TemplArg> \
    		AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    		{ \
     
    #else
    #define BEGIN_TEMPLATE_MESSAGE_MAP(TemplArg, theClass, baseClass) \
    	template <TemplArg> \
    		const AFX_MSGMAP* theClass::GetMessageMap() const \
    			{ return &theClass::messageMap; } \
    	template <TemplArg> \
    		AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
    		{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
    	template <TemplArg> \
    		AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
    		{ \
     
    #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(class baseCDockViewBar, CDockViewBar<TPL_VIEW>,baseCDockViewBar)
    	//{{AFX_MSG_MAP(CDockViewBar)	
    //....
    	//}}AFX_MSG_MAP
    END_TEMPLATE_MESSAGE_MAP()
    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 : public GENERIC_DLGCOLOR
    {
    //...blabla
    DECLARE_TEMPLATE_MESSAGE_MAP()
    };
     
    BEGIN_TEMPLATE_MESSAGE_MAP(class GENERIC_DLGCOLOR, CTplDlgColor<GENERIC_DLGCOLOR>, GENERIC_DLGCOLOR)
    	//{{AFX_MSG_MAP(CTplDlgColor)	
    	ON_WM_CTLCOLOR()
    	//}}AFX_MSG_MAP
    END_TEMPLATE_MESSAGE_MAP()
    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 �clair� 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
    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
    Par d�faut
    oui tout

  9. #9
    Membre �clair� 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
    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(TPL_VIEW);
    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> (pContext);
    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 �clair� 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
    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(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
    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> (pContext, RUNTIME_CLASS (CModelEditorPropertiesView) );
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 �clair� 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
    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(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
    Dans un cas normal, la macro
    revient � ecrire
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ((CRuntimeClass*)(&class_name::classCAge))
    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 ( TPL_VIEW );
    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
    ((CRuntimeClass*)(&class_name::classTPL_VIEW))

  13. #13
    Membre �clair� 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
    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
    Par d�faut
    pfffui tu nous a ressorti un vieux post de derri�re les fagots

  15. #15
    Membre �clair� 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
    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 chevronn�
    Avatar de PetitPapaNo�l
    D�veloppeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    D�tails du profil
    Informations personnelles :
    �ge : 49

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    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 chevronn�
    Avatar de PetitPapaNo�l
    D�veloppeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    D�tails du profil
    Informations personnelles :
    �ge : 49

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    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 chevronn�
    Avatar de PetitPapaNo�l
    D�veloppeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    D�tails du profil
    Informations personnelles :
    �ge : 49

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    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 �clair� 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
    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�

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Utilisation des templates de styles (jrtx)
    Par tnodev dans le forum Jasper
    R�ponses: 2
    Dernier message: 12/11/2007, 15h19
  2. [OpenTBS] Utilisation des templates
    Par fdumont dans le forum Biblioth�ques et frameworks
    R�ponses: 3
    Dernier message: 18/02/2007, 22h43
  3. R�ponses: 7
    Dernier message: 13/02/2007, 15h09
  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