调用重载函数创建std::thread出现E0289错误,如何解决?
解决std::thread调用重载函数时的构造函数匹配错误
当使用重载函数作为std::thread的构造参数时,编译器无法自动推断要选用哪个重载版本,因此会触发E0289 没有匹配的“std::thread::thread”构造函数实例错误。以下是几种可行的解决方法:
方法1:显式类型转换指定重载版本
通过static_cast将函数转换为明确的函数指针类型,直接告诉编译器要选择的重载函数:
std::thread worker(static_cast<void(*)()>(TestMeUsingMiltiThreading));
如果要调用带参数的重载版本,只需调整转换的类型并传入参数:
// 调用接收unsigned int参数的重载函数 std::thread worker(static_cast<void(*)(unsigned int)>(TestMeUsingMiltiThreading), 456);
方法2:用Lambda表达式包裹函数调用
借助Lambda表达式直接调用目标重载函数,编译器能明确匹配到对应的版本:
std::thread worker([](){ TestMeUsingMiltiThreading(); });
调用带参数版本的写法:
std::thread worker([](){ TestMeUsingMiltiThreading(456); });
方法3:先绑定到明确类型的函数指针
先将重载函数赋值给类型明确的函数指针变量,再将该变量传给std::thread构造函数:
void (*targetFunc)() = TestMeUsingMiltiThreading; std::thread worker(targetFunc);
带参数版本的写法:
void (*targetFunc)(unsigned int) = TestMeUsingMiltiThreading; std::thread worker(targetFunc, 456);
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

