4

我是一名初级 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)

我将头文件中的两个函数都声明为私有的。

你们有没有看到我做错了什么?

4

2 回答 2

6

您正在使用需要常规函数指针的成员函数指针成员函数有一个隐含的额外参数:. 不考虑这一点。thispthread_create

您必须使该功能static能够与pthread_create. 然后,您可以使用该void*参数传递this指针。

就个人而言,我会放弃pthreads以支持C++11 std::thread,或者boost::thread如果您无权访问C++11实现。

于 2013-01-11T22:53:44.677 回答
2

编辑:如果您不尝试使用Network该函数的实例,那么 K-ballo 的答案就是您所需要的。如果是,请继续阅读。

pthread_create期望调用普通函数,并且您正在尝试将成员函数用作非成员函数。成员函数不是普通函数,因为它必须有一个调用对象。

您可以创建一个调用 a 的函数Network::SocketHandlerNetwork这样做:

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); 
于 2013-01-11T22:54:46.833 回答