多线程模板成员函数错误



我正在测试如何使用这个代码创建一个线程,但是我被这个错误卡住了。

In file included from rasterization.cpp:1:
rasterization.h: In instantiation of 'void pipeline3D::Rasterizer<Target_t>::render_object(pipeline3D::Object<Triangle, type, Vertex_Shader>) [with type = char; Vertex_Shader = my_shader; Triangle = Triangle; Target_t = char]':
rasterization.cpp:97:40:   required from here
rasterization.h:130:17: error: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, pipeline3D::Rasterizer<char>*, Vertex&, Vertex&, Vertex&, my_shader&)'
std::thread t1(&Rasterizer::render_triangle, this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader);

我不明白为什么它说函数是重载的,因为它是文件中唯一具有该名称的函数。我找不到任何具有模板的类似问题,我尝试了一堆不同的解决方案,但我总是得到同样的错误。

线程的创建是用这段代码创建的。这是我尝试的lambda版本,但它也不起作用。这是lambda版本

的错误
rasterization.h: In member function 'void pipeline3D::Rasterizer<Target_t>::render_object(pipeline3D::Object<Triangle, type, Vertex_Shader>)':
rasterization.h:128:27: error: expected primary-expression before '(' token
auto thr = std::thread( [this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader] { render_triangle( o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader); } );
^
rasterization.h:128:37: error: expected ',' before '.' token
auto thr = std::thread( [this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader] { render_triangle( o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader); } );
^
template<class type, class Vertex_Shader, class Triangle>
void render_object(Object<Triangle, type, Vertex_Shader> o){
int size = o.meshsize;


for(int i = 0; i<size; i++){
//auto thr = std::thread( [this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader] { render_triangle( o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader); } );
//thr.join;
std::thread t1(&Rasterizer::render_triangle, this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader);
t1.join();
//render_triangle(o.mesh[i].v1,o.mesh[i].v2,o.mesh[i].v3, o.shader);
}
}

函数render_triangle是:


template<class Vertex_Shader, class Vertex>
void render_triangle(const Vertex &V1, const Vertex& V2, const Vertex &V3, Vertex_Shader shader){
//do work
}

你能帮我吗?

你不能取模板的地址。您只能使用实例化的地址。在您的例子中,您必须提供模板参数:

std::thread t1(&Rasterizer::render_triangle<decltype(o.mesh[1]), Vertex_Shader>, this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader);

也许你对decltype有一个更好的名字,但是你的代码也没有显示mesh

我的猜测是,当使用std::thread的构造函数时,它无法推断模板参数类型。也许你可以试试这样做:

std::thread t1([this, &o]() {
render_triangle(o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader);
});

或者,如果你不想走lambda路线,你可以显式地告诉它类型是什么:

std::thread t1(&Rasterizer::render_triangle<Vertex_Shader, /*whatever the Vertex type is*/>, this, o.mesh[i].v1, o.mesh[i].v2, o.mesh[i].v3, o.shader);

最新更新