void 类型参数的 C++ 错误

标签 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”时得到错误的类型?

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

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* 的参数,库代码 promise 稍后调用该函数,并将参数传递给它。

顺便说一句,正如 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 类型参数的 C++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405292/

相关文章:

list - Haskell 的 head tail init 和 last 在 GHCi

python - 更改 python 函数参数的类型而不重新绑定(bind)

c++ - 在 Visual C++ 2008 的 Debug模式下找不到 MSVCR90D.dll

函数问题中的 C++ 数组赋值

javascript - 从 'initialize' 中的函数引用 Prototype.js 函数

haskell - Servant 的公共(public) API 中的 Data.Proxy(为什么带有 ScopedTypeVariables 的代理不起作用)

c++ - 0xc000007b 错误?

c++ - Spirit X3,两条规则合二为一不编译

c++ - 为什么在堆栈上声明的数组的变量名不是指针 C++?

list - 如何从 Scala 中的 hashmap 调用函数