前向声明问题

0 c++ windows winapi

我在向前工作申报时遇到了问题(实际上我不确定它是否应该以我想要的方式工作).

我有一个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)

ASh*_*lly 5

没有类定义Presenter,编译器不会如何取地址Presenter::StatDlgProc.具体来说,它不知道它是否是虚拟的.如果它是虚拟的,它需要知道类的vtable的布局,以便生成将查找函数调用的代码.(如果它是静态的,编译器理论上可以在链接时解析地址.)因此,如果没有类定义,编译器就无法决定是为简单函数调用还是为虚函数查找发出指令.