在MFC中的抽象基类上是否需要DECLARE_DYNAMIC?

时间:2012-01-05 14:04:12

标签: c++ templates mfc

我有一个派生自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的支持。

1 个答案:

答案 0 :(得分:3)

首先,如果您想支持IMPLEMENT_DYNCREATE_T(CMyViewT, {specialization}, CView)并从DECLARE_DYNCREATE移除<TYPE>,请在模板上使用DECLARE_DYNCREATE进行每项专业化。

其次,不使用DECLARE_ *可能遇到的唯一问题是使用MFC DYNAMIC_DOWNCAST宏来向下转换为CMyViewT;无论如何,C ++ dynamic_cast都是首选。

如果您计划为每个特化项目推导出模板,那么您的模板视图实际上并不需要DECLARE_DYNCREATE,只需要您的衍生产品。