我在向前工作申报时遇到了问题(实际上我不确定它是否应该以我想要的方式工作).
我有一个cpp文件如下:
int DialogModeless::Create(int dialogID, Presenter* pPresenter)
{
Ptrs* pPtrs = new Ptrs;
pPtrs->pPresenter = pPresenter;
pPtrs->pWnd = _derived;
HINSTANCE hInstance = ::GetModuleHandle(NULL);
_hWnd = ::CreateDialogParam(hInstance, MAKEINTRESOURCE(dialogID), NULL, &Presenter::StatDlgProc,
reinterpret_cast<LPARAM>(pPtrs));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我的方式是Presenter :: StatDlgProc只需要在这一点上声明,因为我只是取其地址.这似乎不是这种情况,因为我从Visual Studio 2008收到以下错误:
错误C2027:使用未定义类型'Presenter'
我必须包含Presenter.h才能编译代码.
任何人都可以向我解释这个吗?
我试图转发声明如下:
class Presenter;
BOOL CALLBACK Presenter::StatDlgProc(HWND, UINT, WPARAM, LPARAM);
Run Code Online (Sandbox Code Playgroud)
没有类定义Presenter,编译器不会如何取地址Presenter::StatDlgProc.具体来说,它不知道它是否是虚拟的.如果它是虚拟的,它需要知道类的vtable的布局,以便生成将查找函数调用的代码.(如果它是静态的,编译器理论上可以在链接时解析地址.)因此,如果没有类定义,编译器就无法决定是为简单函数调用还是为虚函数查找发出指令.
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |