这是一个简单而复杂的问题。
编译:
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 ==========
答案 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
不可复制,因此会出现编译错误。