2012-03-27 81 views
5

这是一个简单而复杂的问题。将fstreams加载到C++的std :: vector中

这编译:

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

这并不编译:

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

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

错误消息:

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

在C++中,这将成为可能:IOStreams是可移动的,矢量将支持可移动类型。 – MSalters 2012-03-27 13:03:53

+0

@ MSalters:引用上述C++ 11标准的部分内容可能会有帮助;-) – 2012-03-27 13:27:26

+1

@FrankH。 :[“几乎所有的27”](http://stackoverflow.com/questions/7066691/is-stdofstream-movable),引用霍华德Hinnant。 – MSalters 2012-03-27 13:42:36

回答

11

目的fstream是不可拷贝。

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

+2

对象不必是可复制的以便移动到容器中:这是C++ 2003的限制。类型是可移动的就足够了,但是你需要使用一个可以移动的物体,例如,无论是临时的还是'std :: move()'的结果。 – 2012-03-27 12:40:58

+0

@DietmarKühl很高兴知道。我必须肯定开始学习C++ 11 – 2012-03-27 13:26:02

+1

此外,'矢量'中的'emplace_back'在VS2013中运行良好。 (虽然在GCC中失败了。) – 2014-05-29 12:33:09

1

将类型推入向量的基本要求是该对象应该可复制,fstream不可复制,因此您会收到编译器错误。

3

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

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

编辑:如果你需要有相同的fstream多个引用,你可以使用的shared_ptr来管理它们。尝试类似:

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

在C++ 2011中,具体的流对象是可移动的。 Howver,利用这个你要么需要通过一个临时的或允许对象的优势,移动:你不能使用file变量在此之后作为流

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

注被搬进files