【发布时间】:2020-03-06 21:43:38
【问题描述】:
考虑以下场景:
// 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>* 的重载函数之前,它确实编译得很好。
【问题讨论】:
-
这两个
Utils::do_something函数是否(大致)做同样的事情?如果不是,那么使用不同的(并且更具描述性的)函数名称将解决它。 -
这是一个显而易见的解决方案,我完全同意你的看法。但是,线程不能接受重载函数是一个记录在案的问题吗?
-
我怀疑期望编译器可以仅根据其余参数的类型推断出第一个参数的正确重载有点牵强,但希望有人能够引用标准为什么不能(或可以)做到这一点。有趣的问题。
-
@SomethingSomething 它比这更广泛:所有需要泛型函子的东西都会在完整的重载集(或函数模板)上窒息。
std::thread、<algorithm>函数等 -
Qt 有一个相关的函数 qOverload 用于不是 Qt 特定的。
标签: c++