void类型参数出现C++错误

C++ Error on void type parameters

本文关键字:C++ 错误 类型参数 void      更新时间:2023-10-16

我有这个标题:

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)

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

错误代码:COMPILE:错误C2664:"tthread::thread::thread(void(__cdecl*((void*(,void*(":无法将类型为"void"的参数1转换为"void(__cd ecl*(

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

正如注释中所提到的(但可能不清楚(,您的代码试图传递函数的返回值,而不是指向函数的指针。

此构造函数

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);