C++ 将istream参数传递给类构造函数时出现问题

C++ 将istream参数传递给类构造函数时出现问题,c++,C++,我的头文件中有以下代码: class Factovisors { public: Factovisors(std::istream& strm):strm_(strm) { } void run() { unsigned int n,m; while (!strm_.eof()) { strm_ >> n >

我的头文件中有以下代码:

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_;

};
编译器给我的错误是:

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
派生的任何输入流。问题是
istream
是一个“接口”。它有纯粹的虚拟功能,所以复制它是没有意义的。您可以做的是保留对已传递流的引用:

std::istream& strm_;

strm
可以是
ifstream
istringstream
或从
istream

派生的任何输入流,因为基类ios的复制子是私有的,所以不能复制构造流。尝试将流成员设置为引用,而不是独立对象。

由于基类ios的复制构造函数是私有的,因此无法复制或构造流。尝试将流成员设置为引用,而不是独立对象。

您正在尝试存储流的副本。这将不起作用,因为流是不可复制的。您所能做的最好的事情就是存储一个引用或指针

但是,如果只有一个方法要使用流,只需传递对此方法的引用

其他问题:

        while (!strm_.eof()) {
        strm_ >> n >> m;

        if (isFact(n,m))
当读取数据的尝试因此失败时,将设置Eof。既然如此,你必须把最后一条读两遍。相反:

while (strm >> n >> m )
    if (isFact(n, m)

您正在尝试存储流的副本。这将不起作用,因为流是不可复制的。您所能做的最好的事情就是存储一个引用或指针

但是,如果只有一个方法要使用流,只需传递对此方法的引用

其他问题:

        while (!strm_.eof()) {
        strm_ >> n >> m;

        if (isFact(n,m))
当读取数据的尝试因此失败时,将设置Eof。既然如此,你必须把最后一条读两遍。相反:

while (strm >> n >> m )
    if (isFact(n, m)