我有一个派生自MFC CView类和模板化类的基类,类似于;
template<class TYPE>
class CMytViewT : public CView,public CMyTemplateClassT<TYPE>
{
DECLARE_DYNCREATE(CMyViewT<TYPE>)
private:
CMyViewT();
'
'
'
}
IMPLEMENT_DYNCREATE(CMyViewT<TYPE>, CView)
现在我猜测模板会让MFC宏感到沮丧,我正在考虑删除这个类的动态创建宏,并为模板的每个特化重新引入它。例如
template<class TYPE>
class CMytViewT : public CView,public CMyTemplateClassT<TYPE>
{
public:
CMyViewT();
'
'
'
}
Class CMyView : public CMyViewT<CMyClass>
{
DECLARE_DYNCREATE(CMyView)
private:
CMyView();
}
IMPLEMENT_DYNCREATE(CMyView, CView)
我想知道这会导致问题的进展,因为我见过的任何其他实现都包含了所有中间类的宏。我看不出它应该,但是我错过了什么?
修改在查看下面的Matthew Holders答案后,我发现了以下microsoft connect article,其中指出由于存在错误而已删除对IMPLEMENT_DYNAMIC_T的支持。
答案 0 :(得分:3)
首先,如果您想支持IMPLEMENT_DYNCREATE_T(CMyViewT, {specialization}, CView)
并从DECLARE_DYNCREATE
移除<TYPE>
,请在模板上使用DECLARE_DYNCREATE
进行每项专业化。
其次,不使用DECLARE_ *可能遇到的唯一问题是使用MFC DYNAMIC_DOWNCAST
宏来向下转换为CMyViewT;无论如何,C ++ dynamic_cast
都是首选。
如果您计划为每个特化项目推导出模板,那么您的模板视图实际上并不需要DECLARE_DYNCREATE,只需要您的衍生产品。