首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将‘void*(Network::*)(void*)’转换为‘void*(*)(void*)’

无法将‘void*(Network::*)(void*)’转换为‘void*(*)(void*)’
EN

Stack Overflow用户
提问于 2013-01-12 06:50:57
回答 2查看 4.1K关注 0票数 4

我是一个初级的C++程序员,我在一台Linux机器上编程。

我得到了这个错误:

代码语言:javascript
复制
cannot convert ‘void* (Network::*)(void*)’ to ‘void* (*)(void*)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)

它是从下面这行开始的:

代码语言:javascript
复制
pthread_create(&thread_id,0,&Network::SocketHandler, (void*)csock );

我尝试调用的函数是:

代码语言:javascript
复制
void* Network::SocketHandler(void* lp)

我在头文件中将这两个函数都声明为private。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 06:53:45

您正在使用成员函数指针,而该指针应为常规函数指针。成员函数有一个隐式的额外参数:thispthread_create没有考虑到这一点。

为了能够在pthread_create中使用它,您必须将函数设置为static。然后,您可以使用void*参数传递this指针。

就我个人而言,我会抛弃pthread,转而使用C++11 std::thread,或者如果您不能访问boost::thread实现,则使用C++11。

票数 6
EN

Stack Overflow用户

发布于 2013-01-12 06:54:47

编辑:如果你不想在函数中使用 Network 的实例,那么K-的答案就是你所需要的。如果你是,那就继续往下读。

pthread_create期望调用一个普通函数,而您却试图将成员函数用作非成员函数。成员函数不是普通函数,因为它必须有一个调用对象。

您可以创建一个在Network上调用Network::SocketHandler的函数,然后这样做:

代码语言:javascript
复制
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); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14287942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档