C++库的thread提示std::invoke未找到匹配的重载函数怎么办
时间: 2023-06-16 15:05:18 浏览: 680
这个错误提示通常是因为 `std::invoke` 函数需要你传入可调用的对象,但是你传入的对象类型不正确,导致编译器无法找到匹配的重载函数。解决方法是确保传入的对象类型正确,并且符合 `std::invoke` 的要求。
下面是一个示例代码:
```c++
#include <iostream>
#include <thread>
#include <functional>
void foo(int n) {
std::cout << "foo: " << n << std::endl;
}
int main() {
int n = 42;
std::thread t(std::invoke<void>(&foo, n)); // 传入可调用对象
t.join();
return 0;
}
```
在上面的代码中,我们通过 `std::invoke` 函数将 `foo` 函数转换为可调用对象,并将其传入 `std::thread` 构造函数中。注意,我们需要显式指定模板参数 `<void>`,以确保编译器正确地推断函数返回值类型。
如果你仍然遇到错误提示,可以检查你传入的对象类型是否正确,并且符合 `std::invoke` 的要求。例如,你需要确保传入的对象是可调用的,并且参数类型和数量与函数参数列表匹配。
相关问题
“std::invoke”: 未找到匹配的重载函数 fit3points c:\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\thr\xthread 238
这个错误是发生在调用`std::invoke`函数时,编译器无法找到匹配的重载函数。`std::invoke`是C++17引入的函数模板,用于统一地调用可调用对象(如函数指针、成员函数指针、函数对象等)。要解决这个问题,你可以检查调用`std::invoke`的代码,确保传递给它的参数类型正确,并且匹配可调用对象的要求。另外,还要确保你的编译器支持C++17标准。如果不支持,可以尝试升级编译器或者使用其他方式来实现你的需求。
cpp17的 std::invoke
std::invoke是C++17标准库中的一个新函数,用于调用函数或者函数对象。它可以方便地处理函数指针、成员函数指针和函数对象的调用,同时支持传递参数和返回值。
这个函数的语法如下:
template <typename F, typename... Args>
decltype(auto) invoke(F&& f, Args&&... args);
其中,F表示要调用的函数或函数对象,Args表示调用该函数时要传递的参数。
使用std::invoke的好处在于,它可以在不同的调用方式下,提供一致的语法和错误处理,使代码更加清晰易懂。例如:
// 调用普通函数
int add(int a, int b) { return a + b; }
int result1 = std::invoke(add, 1, 2);
// 调用成员函数
struct Foo {
int add(int a, int b) { return a + b; }
};
Foo foo;
int result2 = std::invoke(&Foo::add, foo, 1, 2);
// 调用函数对象
struct Bar {
int operator()(int a, int b) { return a + b; }
};
Bar bar;
int result3 = std::invoke(bar, 1, 2);
在上面的例子中,我们使用了std::invoke来调用普通函数、成员函数和函数对象,都使用了相同的语法,使代码更加简洁易懂。