为什么不能将ofstream作为类成员传递给线程?

时间:2019-04-12 08:28:40

标签: c++ multithreading standard-library

我编写了一个带有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;
}

2 个答案:

答案 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