Почему ofstream как член класса не может быть передан в поток? - PullRequest
2 голосов
/ 12 апреля 2019

Я написал класс с перегрузкой 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 ]

8 голосов
/ 12 апреля 2019

Поскольку std::basic_ofstream конструктор копирования удален, см. здесь .Следовательно, ваш конструктор копирования класса dummy также неявно удаляется.Вам нужно переместить ваш объект вместо того, чтобы копировать его:

std::thread t1(std::move(dum));
2 голосов
/ 12 апреля 2019

Проблема заключается в создании экземпляра шаблона функции std::thread::thread<dummy &, void>, где вы видите, что dummy передается как ссылка, и он пытается скопировать dummy объект, включая ofstream (который не может быть скопировано). Вы можете обойти это, используя std::ref, чтобы вместо этого скопировать ссылку на dum в поток.

#include <iostream>
#include <fstream>
#include <thread>

class dummy {
    std::ofstream file;

public:
    dummy() {}
    void operator()() { std::cout << "in thread\n"; }
};

int main() {
    dummy dum;
    std::thread t1(std::ref(dum));
    t1.join(); // dont forget this
}
...