void 类型参数的 C++ 错误
C++ Error on void type parameters
我有这个header:
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" 时得到错误的类型?
错误代码:
编译:错误 C2664:'tthread::thread::thread(void (__cdecl *)(void *),void *)':无法将类型为 'void' 的参数 1 转换为 'void (__cdecl *)(void *)'
thread
函数期望参数 1 为 void (__cdecl *)(void *)
而我的函数只是 void
。我不知道如何使名为 run
的函数与请求的类型相同。
正如评论中提到的(但可能以一种不清楚的方式),您的代码试图传递函数的 return 值,而不是指向函数的指针。
这个构造函数
thread::thread(void (*aFunction)(void *), void * aArg)
需要一个指向函数的指针作为第一个参数。
这个
jmmvAsync::run(file)
调用函数,其结果是函数的 return 值(即 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);
我有这个header:
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" 时得到错误的类型?
错误代码: 编译:错误 C2664:'tthread::thread::thread(void (__cdecl *)(void *),void *)':无法将类型为 'void' 的参数 1 转换为 'void (__cdecl *)(void *)'
thread
函数期望参数 1 为 void (__cdecl *)(void *)
而我的函数只是 void
。我不知道如何使名为 run
的函数与请求的类型相同。
正如评论中提到的(但可能以一种不清楚的方式),您的代码试图传递函数的 return 值,而不是指向函数的指针。
这个构造函数
thread::thread(void (*aFunction)(void *), void * aArg)
需要一个指向函数的指针作为第一个参数。
这个
jmmvAsync::run(file)
调用函数,其结果是函数的 return 值(即 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);