tow*_*owi 3 c c++ member-function-pointers function-pointers pthreads
我想停止警告
server.cpp:823:警告:从'void*(ClientHandler :: )()'转换为'void()(void)'
在通话中:
pthread_create(th, NULL,
(void* (*)(void*)) &ClientHandler::handle,
(void *) clientHandler);
Run Code Online (Sandbox Code Playgroud)
其中handle()是成员函数ClientHandler:
void* ClientHandler::handle();
Run Code Online (Sandbox Code Playgroud)
我很难从编译器中解密函数类型的消息.
问题是:
handle()界面吗?我可以摆脱整体铸造吗?你不能直接这样做,指向成员函数的指针不是函数的简单指针,不能直接交给C回调函数.
您需要一个级别的间接:
void callHandle(void *data) {
ClientHandle *h = static_cast<ClientHandle*>(data);
h->handle();
}
pthread_create(th, 0, &callHandle, static_cast<void*>(handle));
Run Code Online (Sandbox Code Playgroud)
有关更多信息/替代方案,请参阅C++ FAQ 的" 指向成员的指针"部分.
有关演员的有效性callHandle,请参阅此问题.你自己负责确保它handle仍然存在并且当callHandle被调用时(以及它实际上指向a的事实ClientHandle).