C++ 使用类函数创建线程时出错
在下面的代码中,在C++ 使用类函数创建线程时出错,c++,multithreading,C++,Multithreading,在下面的代码中,在线程t(&Fred::hello)中,我得到了一个错误,该术语不会对一个采用0个参数的函数求值。问题是什么 #include <iostream> #include <thread> using namespace std; class Fred { public: virtual void hello(); }; void Fred::hello() { cout << "hello" << endl; } int
线程t(&Fred::hello)
中,我得到了一个错误,该术语不会对一个采用0个参数的函数求值。问题是什么
#include <iostream>
#include <thread>
using namespace std;
class Fred
{
public:
virtual void hello();
};
void Fred::hello()
{
cout << "hello" << endl;
}
int main()
{
thread t (&Fred::hello);
t.join();
return 0;
}
#包括
#包括
使用名称空间std;
弗雷德班
{
公众:
虚拟空hello();
};
void Fred::你好()
{
cout类T
的非静态成员函数需要在T
的实例上调用,并采用类型为T*
的隐式第一个参数(或const和/或volatile T*)
所以
相当于
Fred f;
Fred::hello(&f);
因此,当您将非静态成员函数传递给线程构造函数时,还必须传递隐式第一个参数:
Fred f;
std::thread t(&Fred::hello, &f);
类T
的非静态成员函数需要在T
的实例上调用,并采用类型为T*
(或const和/或volatile T*)的隐式第一个参数
所以
相当于
Fred f;
Fred::hello(&f);
因此,当您将非静态成员函数传递给线程构造函数时,还必须传递隐式第一个参数:
Fred f;
std::thread t(&Fred::hello, &f);
这是一个很好的解释。但是有没有一个版本的线程构造函数可以使用emplace语义?我必须传递&f
,只有线程构造函数再次复制它,这似乎是一种浪费?@Jimm线程构造函数只会复制一个指针,而不是Fred
对象。我只是尝试传递f
,而不是&f
,例如std::threadt(&Fred:hello,f)
而且它似乎在工作。加上构造函数只被调用了一次。在这种情况下,线程构造函数似乎在避免复制f.hmm,没关系,我错了。当我只通过f
时,复制构造函数被调用了3次。知道为什么会被调用3次吗?这是很好的解释。但是有没有一个版本的线程构造函数可以使用emplace语义吗?我必须传递&f
,只有线程构造函数才能再次复制它,这似乎是一种浪费?@Jimm线程构造函数只会复制一个指针,而不会复制一个Fred
对象。我只是尝试传递f
,而不是&f
,例如std::thread t(&Fred:hello,f)
而且它似乎在工作。加上构造函数只被调用一次。在这种情况下,线程构造函数似乎在避免复制f.hmm。没关系,我错了。当我只通过f
时,复制构造函数被调用了3次。知道为什么要调用3次吗?