【发布时间】:2018-08-04 05:23:49
【问题描述】:
我已经问过一个类似的问题,但没有提供足够的细节。所以我试图用更好的代码示例重新表述它。所以就在这里。
首先,我使用 Visual Studio 2008 C++ 编译器,并尝试实现一个模板来调用类的成员方法。
模板声明如下:
typedef void (*ON_CALL)(HWND);
template <typename CLASS, ON_CALL F>
class CMyTemplate
{
public:
static void onProcess(CLASS* pDlg)
{
pDlg->SetTimer(100, 1, _onTimer);
}
private:
static void WINAPI _onTimer(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
KillTimer(hwnd, idEvent);
CLASS* pDlg = (CLASS*)CDialog::FromHandle(hwnd);
if(pDlg)
{
pDlg->F(hwnd);
}
}
};
它实际上是这样称呼的:
void CMyDialog::SomeMethod()
{
CMyTemplate<CMyDialog, OnCall>::onProcess(this); //error C2975
}
void CMyDialog::OnCall(HWND hWnd)
{
//Do work ...
}
但是我在上面标记的那一行给了我这个错误:
错误 C2975:“F”:“CMyTemplate”的模板参数无效, 预期的编译时常量表达式
【问题讨论】:
-
可以出示
CMyDialog::OnCall的声明吗? -
@Brian:这不是静态的:
void OnCall(HWND hWnd); -
那你为什么希望这会起作用? :S
-
void (*ON_CALL)(HWND)不指定类成员函数。这看起来像是在 C++ 类中包装 Windows API 的又一次有缺陷的尝试。您已经在使用 MFC(成功地做到了这一点)。使用 MFC 的实现,直到您能够自己完成。
标签: c++ templates visual-studio-2008 mfc