能否从MFC类(如CDialog)派生并使用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宏? 我目前无法使用模板特化,因为在此类似问题中给出了TYPE和ARG_TYPE的所有可能值。
另一种看待这个问题的方式可能是“我可以将一个模板类嵌入另一个类中,而不需要对模板进行特化或使主机类成为模板类。” 我也无法回答这个问题,但我怀疑答案可能是否定的。
单一类型模板的部分解决方案请参考MSDN这里。