C++模板类使用std::thread调用模板成员函数匹配报错求助
问题原因
1. 直接传递成员函数报错的原因
render_triangle是模板成员函数,你直接取&Rasterizer::render_triangle时,编译器无法自动推导要实例化的模板参数版本,所以识别为未解析的重载函数类型。同时由于你是在模板类Rasterizer的内部调用依赖模板参数的成员模板,需要加template关键字告诉编译器这是一个模板函数。
2. lambda表达式报错的原因
C++标准要求lambda的捕获列表中只能放置变量名,不能直接放o.mesh[i].v1这类带访问操作的表达式,所以语法检查直接报错。
解决方法
方案1:修正直接传递成员函数的写法
显式指定模板参数,并且加上template关键字:
std::thread t1(&Rasterizer::template render_triangle<Vertex_Shader, std::decay_t<decltype(o.mesh[i].v1)>>, this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader);
如果你的编译器不支持std::decay_t,也可以直接用对应顶点类型替换。
方案2:修正lambda表达式的写法
使用C++14及以上支持的初始化捕获,把需要的参数显式捕获:
auto thr = std::thread([this, v1 = o.mesh[i].v1, v2 = o.mesh[i].v2, v3 = o.mesh[i].v3, shader = o.shader]() { render_triangle(v1, v2, v3, shader); }); thr.join();
如果使用C++11标准,可以先把参数提取为局部变量再捕获:
const auto& v1 = o.mesh[i].v1; const auto& v2 = o.mesh[i].v2; const auto& v3 = o.mesh[i].v3; const auto& shader = o.shader; auto thr = std::thread([this, v1, v2, v3, shader]() { render_triangle(v1, v2, v3, shader); }); thr.join();
额外提示
你当前代码中创建线程后立刻调用join(),本质还是串行执行,没有发挥多线程的性能优势。可以把所有创建的线程存入std::vector<std::thread>容器,循环结束后再逐个调用join(),实现并行渲染。
内容的提问来源于stack exchange,提问作者byulor
相关产品推荐
相关产品推荐

