【问题标题】:C++ Error on void type parametersvoid 类型参数上的 C++ 错误
【发布时间】:2015-10-03 00:16:37
【问题描述】:

我有这个标题:

class jmmvAsync
{
public:
    static void run(LPCTSTR msg);
};

还有这个.cpp

void jmmvAsync::run(LPCTSTR msg){
    MessageBox(NULL, msg, NULL, NULL);
}

我正在调用这个函数:

LPTCSTR file = "file";
thread t(jmmvAsync::run(file), 0);

线程函数有这样的结构:

thread::thread(void (*aFunction)(void *), void * aArg)

为什么我在调用“线程”时会得到错误的类型?

错误代码: 编译:错误 C2664:'tthread::thread::thread(void (__cdecl *)(void *),void *)':无法将类型为 'void' 的参数 1 转换为 'void (__cdecl *)(void * )'

thread 函数期望参数 1 为 void (__cdecl *)(void *) 而我的函数只是 void。我不知道如何使名为run 的函数与请求的类型相同。

【问题讨论】:

  • 你试过了吗(&jmmvAsync::run, file)?
  • 你不应该传递函数,而不是函数的返回值吗?
  • @RefugnicEternium 我收到此错误:'&' 需要值 L。而“文件”是 run 的参数,而不是 thread 的参数。
  • @PaulRooney 你是什么意思?我正在尝试使用thread 函数执行异步任务,我需要传递一个异步执行的函数,该函数无效!
  • @ProtectedVoid 传递给thread 的函数采用void* 参数。它在调用时收到的void* 是第二个参数。您正在传递调用函数的结果。

标签: c++ function types void


【解决方案1】:

正如 cmets 中提到的(但可能以不清楚的方式),您的代码尝试传递函数的返回值,而不是指向函数的指针。

这个构造函数

thread::thread(void (*aFunction)(void *), void * aArg)

期望一个指向函数的指针作为第一个参数。

这个

jmmvAsync::run(file)

调用函数,其结果是函数的返回值(void)。这绝对不是你想要的。你想要一个函数的地址:

&jmmvAsync::run

以这种方式将其发送给您的构造函数:

LPTCSTR file = "file";
thread t(&jmmvAsync::run, file);

注意:第二个参数是file,而不是0。这是 C 中的常见模式:您传递函数的地址及其参数,类型为 void*,然后库代码承诺稍后调用该函数,并将参数传递给它。

顺便说一句,正如 Aaron McDaid 提到的,jmmvAsync::run 的类型必须正是您的构造函数所要求的。也就是说,它必须声明为接收void* 类型的参数(不是LPTCSTR),并且是static 成员函数(根据您的代码判断)。由于您使用LPTCSTR 之类的名称,您可能只希望您的代码在 Windows 上运行,因此您无需担心void*LPTCSTR 之间的区别。

如果有疑问,请制作一个包装器:

void wrapper_jmmvAsync_run(void* par)
{
    jmmvAsync::run(static_cast<LPTCSTR>(file));
}

...

LPTCSTR file = "file";
thread t(&wrapper_jmmvAsync_run, file);

【讨论】:

  • 但是第一个参数的类型应该是void (__cdecl *)(void *)&amp;jmmvAsync::run 有这种类型吗?是否需要显式转换为该类型?还是编写一个单独的瘦包装器代表我们调用jmmvAsync::run,然后将包装器传递给线程会更好?
  • 谢谢,我现在明白了,我是 C 的菜鸟。它编译成功。顺便说一句,我在执行它时遇到了运行时错误。我猜是因为使用的库...
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2021-09-01
  • 2021-04-28
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
相关资源
最近更新 更多