为什么ofstream作为class成员不能传递给thread?
Why is ofstream as a class member can not be passed to thread?
我写了一个 class with operator () 重载,我想把这个 class 像函数指针一样传递给线程,所以我把它放在线程中,如下所示。但是,它无法编译,我注意到 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;
}
因为std::basic_ofstream
复制构造函数被删除,见here。因此,您的 dummy
class 复制构造函数也被隐式删除。您需要移动您的对象而不是复制它:
std::thread t1(std::move(dum));
问题出在函数模板特化 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
}
我写了一个 class with operator () 重载,我想把这个 class 像函数指针一样传递给线程,所以我把它放在线程中,如下所示。但是,它无法编译,我注意到 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;
}
因为std::basic_ofstream
复制构造函数被删除,见here。因此,您的 dummy
class 复制构造函数也被隐式删除。您需要移动您的对象而不是复制它:
std::thread t1(std::move(dum));
问题出在函数模板特化 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
}