无法从 void* 类型转换(类名::)() 以键入 void*(*)(void*)
cannot convert from type void*(classname::) () to type void*(*)(void*)
class Scoreget{
private:
//some variables
public:
Scoreget(){
//something here
}
void* basicgetscore(){
//somthing here
}
void getscore(Scoreget s){
pthread_t t;
if(pthread_create(&t,NULL,s.basicgetscore,NULL)==-1){
printf("Error 3n");
exit(3);
}
void *a;
if(pthread_join(t,&a)==-1){
printf("Error n);
exit(4);
}
}
};
我正在尝试运行一个单独的线程来调用函数,因为它使用对execl((的调用,因此会停止我的程序(我在Windows上,无法使用fork(((。将线程与类相结合让我很难过。
从一些谷歌搜索中,我明白我需要使最后一个函数成为朋友或静态并使用某种指针。我已经尝试过,但各部分不适合在一起。我什至无法更改错误类型。现在让我感到沮丧。收到相同的错误:
无法将 Scoreget::basicgetscore 从 void* ((Scoreget::)( 转换为 void* (*( (void *(
将其声明为静态,并添加另一个帮助程序方法:
static void* basicgetscore(void * object){
return ((Scoreget *) object)->dobasicgetscore();
}
void * dobasicgetscore() // new helper method
{
// do stuff here
return NULL;
}
创建 pthread:
if (pthread_create(&t,NULL,basicgetscore,&s) == -1) { ...
另外,要非常小心。 您正在为此线程提供临时变量的地址。 在这种特定情况下是安全的,因为pthread_join在同一个函数中,但是如果你在线程退出之前从函数返回,你将释放你在里面运行线程的对象,这可能会导致各种令人讨厌的行为。 考虑将函数更新为 1( 获取引用或指针或 2( 对this
进行操作。
不能将非静态方法传递给pthread_create
最简单的方法,创建可以运行的静态方法basicgetscore
像这样的东西
static void *Scoreget::basicgetscore_starter(void *p) {
Scoreget *t = (Scoreget *)p;
t->basicgetscore();
}
pthread_create(&t,NULL,&Scoreget::basicgetscore_starter,(void *)&s);
你需要定义一个非成员(静态(函数作为线程函数传递给pthread_create()
。从对象引用没有帮助,因为这是此函数期望的函数指针。不过,您可以使用用户 args void* 指针将指针传递给对象实例。
相关文章:
- 有没有一种方法可以在编译时获得作用域类名
- 错误:需要类名(链表c++)
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- C++20 概念:如何在"requires"子句中引用类名?
- '{'标记之前的预期类名,然后在预声明时无效使用不完整的类型'class class_name'
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 发生注入类名时会发生什么情况?(C++)
- C++包括类名间距和类实例化
- C++ 类名函数()
- 限定的依赖名称查找,其中包含基类的注入类名
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- C++:错误:"{"标记之前的预期类名
- C++,使用类名调用函数
- (结构名/类名)不命名类型C++
- 如何让qDebug编写方法和类名?
- C++方法实现:是否可以避免每次都键入类名?
- 无法<string>从"常量字符 []"转换为<类名>
- 无法从 void* 类型转换(类名::)() 以键入 void*(*)(void*)
- C++错误:"没有从 [类名] 到"void *"的合适转换函数"
- 无法在pthread中从类型void*(类名)(void*)转换为类型void* (*)(void*)