为什么我不能创建std :: ifstreams的std :: stack?

时间:2010-03-02 13:40:22

标签: c++ stl stack iostream ifstream

为什么以下不起作用:

#include <iostream>
#include <fstream>
#include <stack>

std::stack<std::ifstream> s;

-PT

3 个答案:

答案 0 :(得分:10)

std::stack(与所有STL容器一样)要求其包含的类型为“可分配”。在STL中,这意味着它必须具有复制构造函数和operator=std::ifstream没有这些。

您可以想象为什么您不希望能够复制和分配I / O流;当有两个相同流的副本时应该发生什么的语义不明显。读取或写入一个副本是否会影响另一个副本的位置?关闭一个流关闭另一个流?等

如果你想拥有“std::ifstream s的容器”,那么你真正应该做的是“std::ifstream* s的容器”。非常量指针总是可分配的。需要注意的是,在这种情况下,您必须确保在破坏容器之前自己删除指针,因为容器不会为您执行此操作。

答案 1 :(得分:2)

因为流是不可复制的,所以你可以将它们放入标准容器中。

但我们可以通过存储指向流的指针来解决这个问题。但是你不想在标准容器中存储指向流的指针(特别是如果它们是动态分配的)。因此,我们希望提高解决方案。

Boost具有指针容器的概念 这允许您动态分配对象并将指针存储在指针容器中,然后获取对象的所有权并使您可以访问动态对象,就好像它是对象(而不是指针)一样。

因为指针容器取得了所有权,所以不必担心删除该对象。容器会这样做。

因为它允许将包含的对象作为对象而不是指针进行访问,所以它允许您以更自然的方式使用标准算法中的流(使用指针容器进行操作)。

答案 2 :(得分:0)

在这里备份泰勒(投票+1后)。

stl容器会在您提供的对象的位置进行复制。如果你愿意,你可以通过给他们特殊的对象,使用精心设计的复制构造函数和带有引用计数的诸如此类的析构函数来解决这个问题。

一般来说,我觉得这样太麻烦了。根据经验,只在容器中使用小物体。如果你想建立一堆结构或类,请改为使用指针