C++类型转换错误
C++ typecast error
可能的重复项:
空指针:C 和 C++ 之间的区别
嗨,我有以下功能:
void task2(int a)
{
printf(" Task 2 running..n");
sleep(2);
printf(" Task 2 exiting..n");
}
thpool_add_work(threadpool, (void*)task2, (void*)a);
int thpool_add_work(thpool_t* tp_p, void *(*function_p)(void*), void* arg_p)
{
// some code here
}
上面的代码适用于 C,但不能在 C++ 中编译。我收到以下错误:
error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
error: initializing argument 2 of ‘int thpool_add_work(thpool_t*, void* (*)(void*), void*)’
我无法找出此错误的原因。知道为什么当我将文件扩展名更改为 CPP 并进行编译时会出现此错误吗?
您必须
更改task2
的签名以匹配thpool_add_work
参数的类型:
void* task2(void* a)
创建线程的调用将变为
thpool_add_work(threadpool, task2, &a);
假设a
是int
.
如果需要使用 task2
的参数,可以执行以下操作:
int ia = *(int*)a;
更新以回答 OP 评论
thpool_add_work
期望一个带有void*
参数的函数是有原因的。通过这种方式,您可以将任何类型的参数传递到线程函数中,尽管是以类型不安全的方式。
将转换为 void*
的参数的地址作为 thpool_add_work
的第三个参数传递。然后,将指针强制转换为void
指向预期参数类型的指针,并取消引用它以获取参数的值。我举了上面int a
的例子,现在它将如何寻找浮点数:
void* test3(void* a)
{
float fa = *(float*)a;
.....
return NULL;
}
试试这个
thpool_add_work(threadpool, (void* (*)(void*))task2, (void*)a);
C 会自动将void*
转换为任何类型,C++不会。
您可以使用 typedef 改进代码
typedef void* (*worker_func_t)(void*);
thpool_add_work(threadpool, (worker_func_t)task2, (void*)a);
int thpool_add_work(thpool_t* tp_p, worker_func_t function_p, void* arg_p)
{
// some code here
}
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- C++:用户定义的显式类型转换函数错误
- LINUX 操作系统上的错误:令牌之前预期的构造函数、析构函数或类型转换'('?
- 指向类成员函数的指针中存在类型转换错误
- 错误 c++ 在令牌之前'('预期的构造函数、析构函数或类型转换
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- Mat的convertTo函数在OpenCV中将灰度图像的类型转换为CV_32F时抱怨断言错误
- 获取错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换
- Vulkan API 调试函数指针类型转换错误
- 模板扣除 /类型转换错误
- 为什么缩小转换范围不能防止错误类型的map.insert()失败
- 错误:令牌之前的预期构造函数、析构函数或类型转换'*'
- 尝试生成C++ .DLL的视觉对象类型/转换错误
- 在 CUDA 中使用内部类型转换的奇怪错误
- 需要构造函数/析构函数/类型转换错误
- C++模板错误:'<'令牌之前的预期构造函数、析构函数或类型转换
- 迭代器错误从非标量类型转换为非标量类型
- C++类型转换错误
- 为什么数据类型转换错误只出现在C++中而不出现在C中
- 无法将类型转换为类型*-C++编译错误