我希望创建一个存储不同输入流列表的向量,包括cin和一些文本文件。到目前为止,我有这个。
vector<istream> inStreams;
vector<istream>::iterator streamsIterator;
streamsIterator = inStreams.begin();
streamsIterator = inStreams.insert(streamsIterator, cin); ////this has error!
for (char i = 1; argv[i] != NULL; i++) {
streamsIterator = inStreams.insert(streamsIterator, ifstream(argv[i], ifstream::in));
}
问题在于编译器会发出一个很大的错误,这个错误深入到我无法破译的模板库中。
答案 0 :(得分:2)
这里有一些问题。首先是流不是可复制的,因此您无法将它们复制到容器中。虽然如果你有一个非常新的编译器支持它,流是可移动的。
但是因为你想在一个多态的容器中存储不同的类型,你甚至无法移动它们。你不能在分配给{{{{}}的空间中存储std::fstream
。 1}}因为你得到slicing(腐败)。
一种方法是使用指针存储在容器中:
std::istream
不幸的是,现在您遇到所有权问题。您添加的使用int main(int, char* argv[])
{
std::vector<std::istream*> istreams;
istreams.push_back(&std::cin);
for(char** arg = argv + 1; *arg; ++arg)
{
istreams.push_back(new std::ifstream(*arg));
}
}
创建的std::ifstream
对象需要删除,但不应删除全局new
对象。
你如何解决这个问题取决于你想要做什么整体,但混合需要删除的指针与那些不应删除的指针是有问题的。
答案 1 :(得分:1)
此程序无法编译,因为您没有std :: istream类的默认构造函数。
如果使用引用而不是原始类型,则会编译此代码。从向量中删除项目时,请务必释放项目:
#include <vector>
#include <iostream>
#include <fstream>
#include <istream>
using namespace std;
int main(int argc, char* argv[])
{
vector<istream*> inStreams;
vector<istream*>::iterator streamsIterator;
streamsIterator = inStreams.begin();
streamsIterator = inStreams.insert(streamsIterator, &cin); ////this has no error now
for (char i = 1; argv[i] != NULL; i++) {
auto str = new ifstream(argv[i], ifstream::in);
streamsIterator = inStreams.insert(streamsIterator, str);
}
return 0;
}