#include <thread>
#include <iostream>
using namespace std;
class A
{
public:
A(){}
void m(std::string* s)
{
cout<<*s;
}
void m(std::string s)
{
cout<<s;
}
};
int main()
{
A a;
string str="hi!\n";
std::thread(&A::m,a,&str);
}
这不编译;它给出了:
error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, A&, std::string*)’
如果我删除它编译的第二个成员!为什么?我不能在std :: thread中使用重载方法?
答案 0 :(得分:5)
您可以,但必须手动选择所需的过载:
std::thread th(static_cast<void (A::*)(std::string*)>(&A::m),a,&str);
或者你可以使用lambda:
std::thread th([&] { a.m(&str); });
附录:简而言之,这不能自动推断的原因是编译器在搜索正确的构造函数时只能看起来很肤浅。从std::thread
类的相关构造函数模板中查找(制作!)正确的构造函数涉及template argument deduction,并且模板参数推导通常仅在签名而不是函数模板的内部中查找(在这种情况下是一个构造函数模板,这对我们来说是相同的)。相关的构造函数模板是
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
......这本身并没有说明f
和args
在实施深度中的相互作用。没有足够的信息来确定只有一个A::m
超载可以工作,因此无法解决歧义,你必须手动完成。
使编译器更深入地解决这些歧义是否真的可行和/或实际是一个有趣的问题。我想这将是一个很大的挑战。无论哪种方式,它还没有完成。