首页 > 解决方案 > 可以将 MFC 模板基类与 DECLARE_DYNAMIC() 一起使用吗?

问题描述

我的应用程序中有几个几乎相同的视图,所以我决定创建一个 CBaseView 类并且不复制代码。所以我有这样的事情:

template <class BASE_T, class BASE_DOC, class BASE_DLG>
class CBaseView : public CListView
{
 DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)

     void func1()
     {
      // GetData() is just another method in CBaseView
      BASE_T oData = GetData();
      ...
     }

     void func2()
     {
      BASE_DOC* pDocument = (BASE_DOC*) CView::GetDocumet();
      pDocument->DoSomething();
      ...
     }

     void func3()
     {
      ...
      BASE_DLG oBaseDlg();
      oBaseDlg.DoModal();
      ...
     }
}

IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)

之后,我想将 CBaseView 用于其他视图:

CMyView : public CBaseView <MyType, MyDocument, MyDlg> {...};

问题来了:

DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)

IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)

它给了我一些奇怪的错误。我看到我不能将此宏与模板类一起使用。还发现了一个类似的主题,但我在 MFC 中(以及在所有编程领域)都很新,我无法重写它以适用于我的三个模板参数。

我担心我尝试了我能想到的一切,但仍然没有做到。我真的需要找到一种方法或至少另一种方法,所以请大家帮帮我!

标签: templatesvisual-c++mfcmdi

解决方案


我不知道 MFC,但问题很清楚:宏不接受模板实例化。这是可以理解的,因为宏首先被扩展,一旦你实例化模板,你就不会有类似的CBaseView<BASE_T, BASE_DOC, BASE_DLG>东西CBaseView<Foo,FooDoc,FooDlG>,即参数的具体类型。

DECLARE_DYNCREATE是在运行时动态创建实例,而模板仅在编译时存在,因此在某些时候您需要决定要在运行时使用模板的哪些实例化。您可以将实现保留在模板中,但对于您使用的框架使用的类型:

class View1 : public CBaseView<Foo1,FooDoc1,FooDlg1> {
     DECLARE_DYNCREATE(View1)
};
IMPLEMENT_DYNCREATE(View1,CListView)
class View2 : public CBaseView<Foo2,FooDoc2,FooDlg2> {
     DECLARE_DYNCREATE(View2)
};
IMPLEMENT_DYNCREATE(View2,CListView)

推荐阅读