我试图创建通过指向对象的指针访问的成员函数的线程。
所以我有
AbstractBaseClass* object1 = new ChildClass;
然后我想创建一个object1->foo();
所以我试试
thread t1(object->foo(variable));
但它说"没有构造函数std :: thread :: thread的实例匹配参数列表参数类型是无效的。"当我将鼠标悬停在object1上时。
编译时说,
error C2664: 'std::thread::thread(const std::thread &)' : cannot convert argument 1 from 'void' to 'std::thread &&'
1> Expressions of type void cannot be converted to other types
我试过让foo()
成为一个类型的线程(不确定这是否正确)并且它消除了错误但反过来给出了,没有返回我没有返回的类型线程任何原因导致我不知道该为线索返回什么。
我该如何解决这个问题?
这不是家庭作业,对我来说只是一次学习经历。
答案 0 :(得分:3)
std::thread
遵循std::bind
的语法,因此正确的调用是
std::thread t(&AbstractBaseClass::foo, object, variable)
第一个称为指向成员函数的指针。以上将通过值复制传递给它的参数。如果您需要通过引用传递,请使用std::ref
,例如
std::thread t(&AbstractBaseClass::foo, object, std::ref(variable))
请记住,在这种情况下,保持variable
的生命周期比线程更长。
答案 1 :(得分:0)
只需查看std::thread
手册页即可。
你会看到你需要的构造函数看起来像这样:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
因此,请thread t1(object->foo(variable));
thread t1(&class::foo, object, variable);
这个答案