Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用类函数创建线程时出错_C++_Multithreading - Fatal编程技术网

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次吗?