2013-01-11 115 views
2

我是一名C++程序员,我正在Linux机器上编程。无法将'void *(Network :: *)(void *)'转换为'void *(*)(void *)'

我得到这个错误:

pthread_create(&thread_id,0,&Network::SocketHandler, (void*)csock); 

我想调用的函数是:

cannot convert ‘void* (Network::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*) 

它是从该行正在添加

void* Network::SocketHandler(void* lp) 

我宣布双方在头文件中作为私有函数。

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

回答

5

您正在使用一个成员函数指针,其中预计有一个常规的函数指针。 A 成员函数有一个隐含的额外参数:thispthread_create没有考虑到这一点。

您必须使功能static能够与pthread_create一起使用。然后,您可以使用void*参数来传递否则将是this指针。

就个人而言,我只想沟并行线程赞成C++ 11std::thread,或者boost::thread如果你没有访问C++ 11实现。

+0

哦,你可能是正确的,他可能并不想连同'Network'使用它。 +1 –

+0

并使用'pthread_create()'的最后一个参数将this指针传递给'static'方法。可以将'csock'值存储为'Network'类的成员,并让'static'方法通过'this'指针到达它,否则将这两个值存储在一个动态分配的'struct'中,该''static'方法释放完成后使用它。 –

+0

C++ 11? pthreads更容易/更好吗?我在哪里可以找到关于C++ 11线程的一些信息? thx – mjcs

2

编辑:如果你没有试图使用Network这个函数的实例,那么K-ballo的答案就是你所需要的。如果你是,然后阅读。

pthread_create需要一个正常的函数来调用,并且您试图使用成员函数作为非成员函数。成员函数不是一个正常的函数,因为它必须有一个调用对象。

您可以调用一个NetworkNetwork::SocketHandler的功能,做这样的说法:

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); 
+0

为什么'reinterpret_cast'而不是'static_cast'呢? –

+0

@ K-ballo,因为我很笨。 –

+0

我问,因为在指针之间有'reinterpret_cast'有正当理由,但我永远无法记住它们 –

相关问题