我的头文件中有以下代码:
class Factovisors {
public:
Factovisors(std::istream& strm):strm_(strm)
{
}
void run()
{
unsigned int n,m;
while (!strm_.eof()) {
strm_ >> n >> m;
if (isFact(n,m))
std::cout << m << " divides " << n << "!\n";
}
}
std::istream strm_;
};
我的.cpp文件包含以下代码。
std::ifstream strm("factovisor.test");
Factovisors facto(strm);
facto.run();
strm.close();
我的编译器给出的错误是:
std::ios::basic_ios(const std::ios &) is not accessible from
std::istream::basic_istream(const std::istream &)
我想我错过了一些非常明显的东西。所以任何帮助都将不胜感激。
答案 0 :(得分:4)
问题是istream
是一个“界面”。它具有纯虚函数,因此拥有它的副本是没有意义的。你可能会做的是保持对传递的流的引用:
std::istream& strm_;
strm_
可以是ifstream
或istringstream
或来自istream
的任何输入流。
答案 1 :(得分:2)
您无法复制构造流,因为基类ios的副本ctor是私有的。尝试将流成员作为引用,而不是独立的对象。
答案 2 :(得分:2)
您正在尝试存储流的副本。这不起作用,因为流不可复制。你可以做的最好的是存储引用或指针。
但是,如果只有一种方法将使用该流,则只需传递对此方法的引用。
其他问题:
while (!strm_.eof()) {
strm_ >> n >> m;
if (isFact(n,m))
当尝试读取数据因此失败时设置Eof。因为它是你必须两次阅读最后一个条目。代替:
while (strm >> n >> m )
if (isFact(n, m)