使用带有类的流迭代器的错误c2679

时间:2018-08-17 02:38:17

标签: c++ class iterator

我正在尝试创建一个std::istream迭代器,该迭代器使用std::cinint放入包含两个整数的类中。但是,我得到了:

  

错误c2679:找不到二进制'>>'运算符

当我尝试定义迭代器时。如何初始化迭代器?

这是我的代码:

#include <iterator>
#include <iostream>

class data {
public:
    data() = default;
    int num1 = 0;
    int num2 = 0;
};

std::istream_iterator<data> din(std::cin);

data daData = *din;

2 个答案:

答案 0 :(得分:0)

std :: istream_iterator使用运算符>>(std :: istream&,data&)将数据读入对象。由于此运算符>>需要一个现有的数据对象作为参数(以便将数据写入其中),因此迭代器必须构造一个对象,然后才能将流中的数据转储到该对象中,为此,它需要一个默认的构造函数。

您的数据类没有一个。解决该问题的最简单方法就是给它一个。

class data {
public:
    data() = default;
    int num1 = 0;
    int num2 = 0;

    friend std::istream &operator>>(std::istream &, data &);
};

答案 1 :(得分:0)

这是std::istream_iterator from C++ reference的简介:

  

std :: istream_iterator是一个单遍输入迭代器,它通过调用适当的运算符>> 从为其构造的std :: basic_istream对象中读取类型T的连续对象。 / p>

因此,您需要为您的类型提供重载的流提取运算符>>)。

例如:

friend std::istream& operator>>( std::istream& is, data& d )
{
    is >> d.num1 >> d.num2;
    return is;
}

这是一个完整的工作示例,其中包含重载的流提取>>)和 inserttion <<)运算符:

#include <iterator>
#include <iostream>

class data
{
public:
    data() = default;
    int num1 = 0;
    int num2 = 0;

    friend std::istream& operator>>( std::istream& is, data& d )
    {
        is >> d.num1 >> d.num2;
        return is;
    }

    friend std::ostream& operator<<( std::ostream& os, const data& d )
    {
        os << "[" << d.num1 << ", " << d.num2 << "]";
        return os;
    }
};

int main()
{
    std::istream_iterator<data> din(std::cin);
    data daData = *din;

    std::cout << daData;

    return 0;
}

这是输入为1 2的输出:

  

[1,2]

这是实时示例:https://ideone.com/1Y4TcQ