C++中Lambda函数作为std::thread参数传递时的编译错误问题
解决模板函数作为线程参数的编译错误
错误原因
func_thread是模板函数,直接调用时编译器能从传入的参数自动推导模板参数,但std::thread的构造函数无法完成这个推导过程,导致编译器无法确定要实例化哪个版本的func_thread,因此抛出“未解析的重载函数类型”错误。
解决方案
方案1:显式指定模板参数
明确告诉编译器func_thread的模板参数类型,消除推导歧义:
#include <iostream> #include <thread> #include <cstdio> template <typename lambda,typename val> inline void func_thread(lambda func, val value){ func(value); } int main(){ auto lambda = [] (int v){ printf("lambda: %i\n",v); }; func_thread(lambda,5); // 显式指定模板参数 std::thread ui( func_thread<decltype(lambda), int>, lambda, 5 ); ui.join(); // 必须等待线程结束,否则main退出会导致程序异常 }
方案2:用lambda包裹调用(推荐)
将func_thread的调用逻辑封装到一个lambda中,让std::thread直接执行这个lambda,避开模板参数推导问题:
#include <iostream> #include <thread> #include <cstdio> template <typename lambda,typename val> inline void func_thread(lambda func, val value){ func(value); } int main(){ auto lambda = [] (int v){ printf("lambda: %i\n",v); }; func_thread(lambda,5); // 用lambda包裹调用 std::thread ui([&](){ func_thread(lambda, 5); }); ui.join(); // 必须等待线程完成 }
注意:示例中添加了
ui.join(),如果不等待线程结束,main函数退出时会终止未完成的线程,导致程序行为异常。
内容的提问来源于stack exchange,提问作者Lucyanno Frota
相关产品推荐
相关产品推荐

