gpt4 book ai didi

c++ - 自定义 MFC 窗口/对话框可以是类模板实例化吗?

转载 作者:行者123 更新时间:2023-11-30 01:00:11 26 4
gpt4 key购买 nike

MFC 在创建对话框时使用了一堆特殊的宏,在我的快速测试中,我在尝试编译模板对话框类时遇到了奇怪的错误。这可能是一个很大的痛苦吗?

这是我尝试过的:

MyDlg.h

template <class W>
class CMyDlg : public CDialog
{
typedef CDialog super;
DECLARE_DYNAMIC(CMyDlg <W>)

public:
CMyDlg (CWnd* pParent); // standard constructor
virtual ~CMyDlg ();

// Dialog Data
enum { IDD = IDD_MYDLG };

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

DECLARE_MESSAGE_MAP()

private:
W *m_pWidget; //W will always be a CDialog
};



IMPLEMENT_DYNAMIC(CMyDlg<W>, super) <-------------------

template <class W>
CMyDlg<W>::CMyDlg(CWnd* pParent)
: super(CMyDlg::IDD, pParent)
{
m_pWidget = new W(this);
}

我遇到了一大堆错误,但主要的错误似乎是:

error C2955: 'CMyDlg' : use of class template requires template argument list

我尝试使用一些专门的宏模板版本,但没有多大帮助,其他错误发生了变化,但这个错误仍然存​​在。请注意,我的代码都在一个文件中,因为 C++ 模板不喜欢正常的 .h/.cpp。

我假设过去一定有人这样做过,可能创建了自定义版本的宏,但我无法通过搜索找到它,因为"template"有其他含义。

最佳答案

您可能还有其他问题,但一件事必须是您对 super 的使用.那是 java 的东西而不是 C++ 的东西。而不是 super你需要使用 CDialog .

调查IMPLEMENT_DYNAMIC之后宏定义与模板不兼容,它不使用 template <class T>函数定义之前的语法。您需要做的是定义模板的派生类特化,然后对它们使用宏。所以你可以这样做:

class MyDlgA : public CMyDlg<A>
{
};

IMPLEMENT_DYNAMIC(MyDlgA, CDialog);

然后针对您想要的所有特化执行此操作。如果这不可行,请查看宏并制作您自己的模板化版本。

编辑:根据我的评论,您可以制作这样的宏:

#define INSTANTIATE_DLG_TEMPLATE(T)  \
class MyDlg##T : public CMyDlg<T> \
{ \
}; \
\
IMPLEMENT_DYNAMIC(MyDlg##T, CDialog);

然后只需在您通常使用 typedef 在头文件中定义模板特化的任何地方使用它。

关于c++ - 自定义 MFC 窗口/对话框可以是类模板实例化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3004870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com