成员函数指针(DWORD(WINAPI Foo::*)(LPVOID))是与函数指针()不同的类型DWORD(WINAPI *)(LPVOID).成员函数具有隐藏this参数,导致签名不匹配.
最简单的方法是使用C++ 11的<thread>标头:
struct Foo {
void threadProc() {}
};
int main() {
Foo foo;
std::thread t{&Foo::threadProc, foo, /*other arguments to threadProc*/};
t.join();
}
Run Code Online (Sandbox Code Playgroud)
如果你不得不诉诸CreateThread,请使用void *参数传递实例:
struct Foo {
DWORD threadProc() {...}
};
extern "C" DWORD WINAPI proxyThreadProc(LPVOID userData) {
auto foo = static_cast<Foo *>(userData);
if (foo) {foo->threadProc();}
}
int main() {
Foo foo;
CreateThread(..., proxyThreadProc, &foo, ...);
}
Run Code Online (Sandbox Code Playgroud)
你的班级中的那个现在可以是你想要的任何东西(比如a std::function)并且仍然可以工作,只要在代理程序中使用正确的参数调用它.