考虑以下场景:
//utils.h
#include <string>
#include <list>
namespace Utils {
void do_something(int a, std::list<int> *b);
void do_something(int a, std::list<std::string> *b);
};
//utils.cpp
#include "utils.h"
void Utils::do_something(int a, std::list<int> *b) {
}
void Utils::do_something(int a, std::list<std::string> *b) {
}
// main.cpp
#include <thread>
#include <list>
#include "utils.h"
int main() {
std::list<int> list;
std::thread t(Utils::do_something, 17, &list);
t.join();
return 0;
}
编译时出现如下错误:
error: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, int, std::list<int>*)'
知道我做错了什么吗?在我添加获取 std::list<std::string>*
的重载函数之前,它确实编译得很好。
最佳答案
这里的问题是,即使您将参数传递给 std::thread
,它也不会使用这些参数来尝试确定传递给它的函数。它试图单独解析函数类型。当它这样做时,它发现有两个不同的版本,所以它停止了,因为它不知道你想要哪个。
不幸的是,您将不得不告诉编译器您要使用哪个函数。您可以通过将函数强制转换为您想要的特定函数指针来实现。
尽管您可以使用 lambda 来简化此操作,方法是允许在常规函数调用中进行重载解析,例如
std::thread t([](auto first, auto second){ return Utils::do_something(first, second); }, 17, &list);
这也适用于成员函数,因为您只需使用 lambda 的捕获列表捕获要调用函数的对象。这使您不必将该对象传递给 std::thread
或使用 std::bind
。
关于C++ - 在 std::thread 中调用重载函数时编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049407/