C++ 类型转换错误

标签 c++ casting

Possible Duplicate:
void pointers: difference between C and 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);

假设aint

如果您需要使用task2的参数,您可以执行以下操作:

int ia = *(int*)a;

更新以回答OP评论

thpool_add_work 出于某种原因需要一个带有 void* 参数的函数。通过这种方式,您可以将任何类型的参数传递到线程函数中,尽管是以类型不安全的方式。

您将转换为 void* 的参数地址作为 thpool_add_work 的第三个参数传递。然后,将指向 void 的指针转换回指向预期参数类型的指针,并取消引用它以获取参数的值。我在上面给出了 int a 的示例,现在它如何查找 float :

void* test3(void* a)
{
float fa = *(float*)a;
.....
return NULL;
}

关于C++ 类型转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721627/

相关文章:

c++ - C++ 是否支持编译时计数器?

c++ - 为什么在这个信号声明中有一个指向任何东西的指针?

c++ - 关于c++中const_cast的问题

javascript - Chrome Cast 未收到消息

c# - 当编译时类型未知时,将对象动态转换为类型

c++ - 在 MyClass 指针的容器中找到一个 void 指针?

c++ - 超过 Hackerrank 的时间限制

c++ - 实现 C++ grpc 异步客户端时如何轮询 CompletionQueue?

c++ - 在 C++ 中,访问说明符不控制静态成员的可见性吗?

java - 返回 Object1.java 的 web 服务与客户端应用程序中的 Object1.java 不一样?