首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:‘void*(Thread::)(void*)’类型的参数与‘void*(*)(void*)’不匹配

错误:‘void*(Thread::)(void*)’类型的参数与‘void*(*)(void*)’不匹配
EN

Stack Overflow用户
提问于 2013-04-17 08:53:46
回答 3查看 4.2K关注 0票数 0

我正在使用pthread实现我自己的线程类。因此,我创建Thread类,如下所示:

代码语言:javascript
复制
class Thread
{
public:
  Thread()
  {
  }

  virtual void* run(void *params) = 0;

  void start(void *params)
  {
    pthread_create (&threadId, 0, run, params);
    pthread_join (threadId, 0);
  }

private:
  pthread_t threadId;
};

在实现了这个类并覆盖了virtual run函数之后,我编译了这个项目。但是error: argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void*)’发生了。我的代码出了什么问题?

提前感谢:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-17 09:02:42

pthread_create是一个C函数,对C++成员函数一无所知。您需要为它提供一个静态或非成员函数,并通过pthread_create的最后一个参数传递一个指向Thread对象的指针;类似于:

代码语言:javascript
复制
class Thread
{
    virtual void* run(void *params) = 0;

    void start(void * params)
    {
        this->params = params;
        pthread_create(&threadId, 0, &Thread::static_run, this);
    }

    static void * static_run(void * void_this)
    {
         Thread * thread_this = static_cast<Thread*>(void_this);
         return thread_this->run(thread_this->params);
    }

private:
    pthread_t threadId;
    void *params;
};

当然,在现代C++中,这要简单得多:

代码语言:javascript
复制
std::thread thread;

void start(void * params)
{
    thread = std::thread([this]{run(params);});
}

(当然,您不应该使用void*来传递参数,而且可能从一开始就没有很好的理由将线程包装在类中。)

票数 2
EN

Stack Overflow用户

发布于 2013-04-17 08:59:44

这就是编译器告诉你的。

pthread_create需要一个带有签名的函数:

void* (*)(void*)

它是一个函数指针。

但是,您使用此签名提供了一些东西:

void* (Thread::)(void*)

它不是函数指针,而是指向成员函数的指针。有一个区别:指向成员函数的指针需要一个对象的实例才能正常工作(在这里,它需要一个Thread的实例)。

通常的解决方案是让你的函数成为Thread :它将不再是一个成员函数-它不再需要run的实例来正常工作,你可以将当前的实例作为pthread_create的最后一个参数传递,以便在线程启动后对其执行操作。您只需要将参数保存在类本身中。

代码语言:javascript
复制
public:
 void start(void *params)
 {
  this->my_thread_params = params;
  pthread_create (&threadId, 0, run, static_cast<void*>(this));
 }

private:
  static void *run(void *my_object)
  {
    // here, my_object already contains the params you passed to the function start
    static_cast<Thread*>(my_object)->my_member_function();
  }
票数 3
EN

Stack Overflow用户

发布于 2013-04-17 08:59:53

错误消息告诉您,指向Thread中接受并返回void* (void* (Thread::*)(void*))的成员函数的指针不能转换为指向接受并返回相同void*的函数的指针。

虽然成员函数的声明看起来类似于您需要的类型,但是有一个隐式的Thread类型的this指针,它需要在对Thread::run的任何调用中注入

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16049640

复制
相关文章

相似问题

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