是否可以从CDialog等MFC类派生并使用C++模板类。我已经尝试过,但实现失败于用于消息路由的 MFC 宏。例如;
template<class TYPE, class ARG_TYPE>
class CMyDialogT : public CDialog
{
public:
CMyDialogT(CMyContainerT<TYPE,ARG_TYPE> *pData,CWnd* pParent = NULL);
CMyContainerT<TYPE,ARG_TYPE> *m_pData;
// Generated message map functions
//{{AFX_MSG(CMyDialogT)
afx_msg void OnUpdateMyControl();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
template<class TYPE, class ARG_TYPE>
CMyDialogT<TYPE,ARG_TYPE>::CMyDialogT(CMyContainerT<TYPE,ARG_TYPE> *pData,CWnd* pParent)
: CDialog(CMyDialogT::IDD, pParent)
{
m_pData = pData;
}
BEGIN_MESSAGE_MAP(CGlobalEditT<TYPE,ARG_TYPE>, CDialog)
//{{AFX_MSG_MAP(CGlobalEditT)
ON_EN_UPDATE(IDC_MY_CONTROL, OnUpdateMyControl)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
上面的编译失败,消息序列如下;
warning C4002: too many actual parameters for macro 'BEGIN_MESSAGE_MAP'
error C2653: 'TYPE' : is not a class or namespace name
除了手动展开 MFC 宏之外,是否有任何解决方法?我现在不能使用模板特化,如 similar question here 中所给出的那样因为我不知道 TYPE 和 ARG_TYPE 的所有可能值。
看待这个问题的另一种方式是“我可以在另一个类中嵌入一个模板类,而不需要特化模板或使宿主类成为模板类吗”。这个我也答不上来,我怀疑答案可能是否定的。
编辑 MSDN here 上单一类型模板的部分解决方案
最佳答案
您必须使用 BEGIN_TEMPLATE_MESSAGE_MAP 而不是 BEGIN_MESSAGE_MAP。
关于c++ - 将 MFC 宏与模板一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728957/