我编写了一个带有operator()重载的类,我想像传递给线程的函数指针一样传递此类,因此我将其放置在线程中,如下所示。但是,它未能编译,我注意到ofstream是它失败的原因。为什么会这样呢?
#include <thread>
#include <fstream>
using namespace std;
class dummy{
public :
dummy(){}
void operator()(){}
private:
ofstream file;
};
int main()
{
dummy dum;
thread t1(dum);
return 0;
}
答案 0 :(得分:8)
由于std::basic_ofstream
复制构造函数已删除,请参见here。因此,您的dummy
类副本构造函数也被隐式删除。您需要移动对象而不是复制它:
std::thread t1(std::move(dum));
答案 1 :(得分:2)
问题出在函数模板专门化std::thread::thread<dummy &, void>
的实例化中,您在其中看到dummy
被作为引用传递,并且它试图复制dummy
对象,包括{{1 }}(无法复制)。您可以通过使用ofstream
实际上将对std::ref
的引用复制到线程中来解决此问题。
dum