Wenzel

Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Подскажите пожалуйста, что не так? При компиляции в VS2008 выдает ошибку Код: 1>Compiling... 1>Modeless.cpp 1>.\Neo\GUI\Modeless.cpp(35) : error C2906: 'const AFX_MSGMAP *CModWin<DIALOG>::GetThisMessageMap(void)' : explicit specialization requires 'template <>' 1> with 1> [ 1> DIALOG=CDialog 1> ] | Если закомментировать первый блок BEGIN_MESSAGE_MAP-END_MESSAGE_MAP, то выдает Код: 1>.\Neo\GUI\Modeless.cpp(40) : error C2906: 'const AFX_MSGMAP *CModWin<DIALOG>::GetThisMessageMap(void)' : explicit specialization requires 'template <>' 1> with 1> [ 1> DIALOG=CResizableDialog 1> ] | и так далее в таком стиле. В справке очень скудно описана эта ошибка: Код: The following sample generates C2906: Copy Code // C2906.cpp // compile with: /c template<class T> class X{}; // primary template class X<int> { } // C2906 template<> class X<int> { }; // new syntax | Гуглил, но так ничего и не добился в результате Мне бы один блок из этих мапов заставить компилироваться, дальше сам постараюсь разобраться. файлы: modeless.cpp Код: #include "stdafx.h" #include "Modeless.h" #include "emule.h" #include "emuleDlg.h" #include "UserMsgs.h" CWnd* GetEmuleDlg() {return theApp.emuledlg;} #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif // NEO: MLD - [ModelesDialogs] -- Xanatos --> BEGIN_MESSAGE_MAP(CModWin<CDialog>, CDialog) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModWin<CResizableDialog>, CResizableDialog) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModSht<CPropertySheet>, CPropertySheet) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModSht<CResizableSheet>, CResizableSheet) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModSht<CListViewWalkerPreferenceSheet>, CListViewWalkerPreferenceSheet) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModSht<CListViewWalkerPropertySheet>, CListViewWalkerPropertySheet) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModWlkSht<CListViewWalkerPreferenceSheet>, CListViewWalkerPreferenceSheet) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CModWlkSht<CListViewWalkerPropertySheet>, CListViewWalkerPropertySheet) ON_COMMAND(IDOK, OnOK) ON_COMMAND(IDCANCEL, OnCancel) END_MESSAGE_MAP() | modeless.h Код: #pragma once #include "ResizableLib/ResizableSheet.h" #include "ResizableLib/ResizableDialog.h" #include "ListViewWalkerPropertySheet.h" #include "ListViewWalkerPreferenceSheet.h" CWnd* GetEmuleDlg(); // NEO: MLD - [ModelesDialogs] -- Xanatos --> template<class WINDOW> class CModWnd : public WINDOW { public: CModWnd() { m_bDeleteOnClose = TRUE; m_bActive = FALSE; } void OpenDialog(UINT bDeleteOnClose = TRUE) { m_bDeleteOnClose = bDeleteOnClose; if (!m_bActive){ m_bActive = TRUE; CallCreate(); } ShowWindow(SW_SHOW); SetFocus(); } virtual void CloseDialog() { if (m_bActive) DestroyWindow(); } bool IsDialogOpen() { return (m_bActive == TRUE); } protected: virtual void CallCreate() = 0; virtual BOOL OnInitDialog(){ UINT old_nFlags = m_nFlags; m_nFlags |= WF_CONTINUEMODAL; BOOL bResult = WINDOW::OnInitDialog(); m_nFlags = old_nFlags; return bResult; } afx_msg void OnOK() { UpdateData(); DestroyWindow(); } afx_msg void OnCancel() { DestroyWindow(); } afx_msg void PostNcDestroy() { m_bActive = FALSE; if (m_bDeleteOnClose) delete this; } BOOL m_bActive; BOOL m_bDeleteOnClose; }; template<class DIALOG> class CModWin : public CModWnd<DIALOG> { public: CModWin(UINT nIDTemplate, CWnd* /*pParent*/ = NULL):CModWnd<DIALOG>(){ m_nIDTemplate = nIDTemplate; } protected: virtual void CallCreate() { Create(m_nIDTemplate, GetEmuleDlg()); } DECLARE_MESSAGE_MAP() UINT m_nIDTemplate; }; template<class SHEET> class CModSht : public CModWnd<SHEET> { public: CModSht():CModWnd<SHEET>() {} protected: virtual void CallCreate() { Create(GetEmuleDlg(), WS_SYSMENU | WS_POPUP | WS_CAPTION | DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_MINIMIZEBOX); } virtual BOOL OnInitDialog(){ // Modeless property sheets don't have Ok and Cancel buttons by default // This little trick fulls the property sheet into thinking it's modal // during it's init, so that it doesn't disable the Ok and Cancel buttons BOOL old_bModeless = m_bModeless; m_bModeless = FALSE; BOOL bResult = CModWnd<SHEET>::OnInitDialog(); m_bModeless = old_bModeless; return bResult; } afx_msg void OnOK() { SendMessage(WM_COMMAND, ID_APPLY_NOW); CModWnd<SHEET>::OnOK(); } DECLARE_MESSAGE_MAP() }; template<class WLK_SHEET> class CModWlkSht : public CModSht<WLK_SHEET> { public: CModWlkSht(CListCtrlItemWalk* pListCtrl):CModSht<WLK_SHEET>() { m_pListCtrl = pListCtrl; } void DropControl() { m_pListCtrl = NULL; m_bDeleteOnClose = TRUE; if(!IsDialogOpen()) delete this; } protected: DECLARE_MESSAGE_MAP() }; typedef CModWin<CDialog> CModDialog; typedef CModWin<CResizableDialog> CModResizableDialog; typedef CModSht<CPropertySheet> CModPropertySheet; typedef CModSht<CResizableSheet> CModResizableSheet; typedef CModWlkSht<CListViewWalkerPreferenceSheet> CModListViewWalkerPreferenceSheet; typedef CModWlkSht<CListViewWalkerPropertySheet> CModListViewWalkerPropertySheet; |
|