[英]problem passing in istream argument to a class constructor
我的头文件中有以下代码:
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 &)
我想我确实缺少一些明显的东西。 因此,任何帮助将不胜感激。
问题在于istream
是一个“接口”。 它具有纯虚函数,因此没有副本是没有意义的。 您可能要做的是保留对传递的流的引用:
std::istream& strm_;
strm_
可以是ifstream
或istringstream
或从istream
派生的任何输入流。
您无法复制构造流,因为基类ios的复制ctor私有。 尝试使流成员成为引用,而不是独立对象。
您正在尝试存储流的副本。 这是行不通的,因为流不可复制。 最好的办法是存储引用或指针。
但是,如果只有一种方法要使用该流,则只需传递对该方法的引用即可。
其他问题:
while (!strm_.eof()) {
strm_ >> n >> m;
if (isFact(n,m))
因此,当尝试读取数据失败时将设置Eof。 因为它是您必读两次的最后一项。 代替:
while (strm >> n >> m )
if (isFact(n, m)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.