我正在尝试创建一个std::istream
迭代器,该迭代器使用std::cin
将int
放入包含两个整数的类中。但是,我得到了:
错误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;
答案 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