我是一名C ++程序员,我在Linux机器上编程。
我收到了这个错误:
cannot convert ‘void* (Network::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)
它来自这条线:
pthread_create(&thread_id,0,&Network::SocketHandler, (void*)csock );
我试图调用的函数是:
void* Network::SocketHandler(void* lp)
我将头文件中的两个函数都声明为私有。
你们有没有看到我做错了什么?
答案 0 :(得分:6)
您正在使用成员函数指针,其中需要常规函数指针。 成员函数具有隐式额外参数:this
。 pthread_create
没有考虑到这一点。
您必须使函数static
能够与pthread_create
一起使用。然后,您可以使用void*
参数传递this
指针。
就个人而言,如果您没有访问权限,我会放弃 pthreads 以支持 C ++ 11 std::thread
或boost::thread
到 C ++ 11 实现。
答案 1 :(得分:2)
编辑:如果您没有尝试使用Network
的实例,那么K-ballo的答案就是您所需要的。如果是,请继续阅读。
pthread_create
期望调用正常函数,并且您尝试将成员函数用作非成员函数。成员函数不是普通函数,因为它必须有一个调用对象。
您可以在Network::SocketHandler
上创建一个调用Network
的函数并按此方式执行:
void* call_sockethandler(void* nw) {
Network* network = static_cast<Network*>(nw);
void* result = network->SocketHandler(somearg);
// do something w/ result
return nullptr;
}
Network nw; // this can't go out of scope though
pthread_create(&thread_id, 0, call_sockethandler, &nw);