错误:类型' void* (Thread::)(void*) '的参数与' void* (*)(void*) '
error: argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void*)’
我正在为自己使用pthread
实现线程类。因此,我创建Thread
类如下:
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*)’
。我的代码有什么问题?
提前感谢:)
就是编译器告诉你的。
pthread_create正在等待一个签名为:
的函数 void* (*)(void*)
是一个函数指针。
但是,您提供的内容具有以下签名:
void* (Thread::)(void*)
不是函数指针,而是指向成员函数的指针。不同之处在于:指向成员函数的指针需要一个对象的实例才能正常工作(这里需要一个Thread的实例)。
一个常见的解决方案是让你的函数run
static
:它不再是一个成员函数-它不再需要一个线程的实例来正常工作了,你可以传递你的当前实例作为pthread_create
的最后一个参数,以便在线程启动后对它进行操作。您只需要将参数保存在类本身中。
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();
}
pthread_create
是一个C函数,对c++成员函数一无所知。你需要给它一个静态或非成员函数,并通过pthread_create
的最后参数传递一个指向Thread
对象的指针;比如:
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++中,这要简单得多:
std::thread thread;
void start(void * params)
{
thread = std::thread([this]{run(params);});
}
(当然,您不应该使用void*
来传递参数,而且可能没有很好的理由将线程包装在一个类中。)
这个错误信息告诉你,一个指向Thread
中接受并返回void*
(void* (Thread::*)(void*)
)的成员函数的指针不能转换为指向接受并返回相同void*
的函数的指针。
虽然成员函数的声明可能看起来与您需要的类型相似,但在任何调用Thread::run
Thread
类型的隐式this
指针。
- 在派生函数中指定void*参数
- void 函数可以传递值参数吗?
- 如何在C++中使用 Void 而不会收到有关参数的错误
- std::function<void()> 接受参数
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 是否将invoke_result与void参数类型一起使用
- 组合模板参数形成函数签名时无效的 void 参数
- 使用void* 参数定义纯虚函数的抽象基类.派生类匹配参数是指向某种类型的指针
- 为什么 void 参数不能存在于具有多个参数的函数中?
- Pthreads将void*参数强制转换为int数组
- C 函数声明对类型"void(*fcn)(void*)"参数的说明
- 从模拟函数调用中捕获 void* 参数
- 为void参数指定一个模板
- 如何在c++ OCX模块中指定一个接受void*参数的函数
- 某些 GL 函数的好奇"void*"参数
- 如何在C++中为多个对象类型使用void*参数
- 如何使void*参数在函数中保存其局部结果,该函数使用struct *调用
- 在需要void*参数的函数中传递unique_ptr最安全的方法是什么?
- 如何在类/函数模板中传递void参数
- 没有参数和C++中的void参数有什么区别