在c ++中将fstreams加载到std :: vector中

时间:2012-03-27 12:07:43

标签: c++ visual-studio-2010 vector fstream

这是一个简单而复杂的问题。

编译:

int Test;
vector<int> TEST;
TEST.push_back(Test);
cout << TEST.size();

这不编译:

fstream Test;
vector<fstream> TEST;
TEST.push_back(Test);
cout << TEST.size();

有什么特别的原因吗? 有没有办法让我获得动态的fstream列表?

错误消息:

1>------ Build started: Project: vector_test, Configuration: Debug Win32 ------
1>  vector_test.cpp
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream(1347): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_fstream<_Elem,_Traits>::basic_fstream(const std::basic_fstream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

4 个答案:

答案 0 :(得分:11)

对象fstream不可复制。

如果您需要在fstream中记录vector,您可以声明std::vector<std::fstream*>并推回该对象的地址。请记住,如果保存指针,则必须确保在访问时,对象仍处于活动状态。

答案 1 :(得分:5)

在C ++ 2011中,具体的流对象是可移动的。但是,要利用这一点,您需要传递临时或允许移动对象:

std::vector<std::ofstream> files;
files.push_back(std::ofstream("f1"));
std::ofstream file("f2");
files.push_back(std::move(file));

请注意,在此流转移到file后,您无法使用files变量。

答案 2 :(得分:3)

要使用带向量的类,它必须是可复制的。 fstream不是。

请参阅:C++ std::ifstream in constructor problem

编辑:如果您需要对同一个fstream进行多次引用,则可以使用shared_ptr来管理它们。尝试类似:

std::vector< std::shared_ptr<fstream> > TEST

答案 3 :(得分:1)

将类型推送到向量中的基本要求是对象应该是可复制的,fstream不可复制,因此会出现编译错误。