C ++错误的void类型参数

时间:2015-07-14 11:26:54

标签: c++ function types void

我有这个标题:

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)

为什么在调用" thread"?

时出现错误的类型

错误代码: COMPILE:错误C2664:' tthread :: thread :: thread(void(__ cdecl *)(void *),void *)' :无法使用' void'类型转换参数1 to' void(__ cdecl *)(void *)'

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

1 个答案:

答案 0 :(得分:1)

正如在评论中提到的那样(但可能是一种不清楚的方式),你的代码试图传递函数的返回值,而不是指向函数的指针。

此构造函数

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之间的区别。< / p>

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

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

...

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