c++ - 将 MFC 宏与模板一起使用

标签 c++ templates mfc

是否可以从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/

相关文章:

c++ - 具有许多成员变量的类的最佳实践

c++ - C丢失指针

c++ - 模板 ID 与任何模板声明都不匹配

c++ - VC++/C++ 高性能多线程GUI交易注意事项

c++ - 从 time_t 到 const time_t* 的转换无效

c++ - 从 for(int &i : i) 获取当前迭代器

c++ - 将虚函数放入一个族中

c++ 0x在模板中继承构造函数

c++11 - 使用 CString 实现 tokenize 函数

c - 错误 C2065 : 'Test_Proc' : undeclared identifier which 'Test_Proc' already exists