我有一个名为point
的结构,并且正在尝试重载istream
运算符,但无法访问x
和y
变量。
struct point {
int x;
int y;
point(int x = 0, int y = 0)
: x{x}, y{y}
{}
};
std::istream& operator>>(std::istream& is, const std::vector<point> &d){
return is >> d.x >> d.y; //error const class std::vector<point> has no member named x or y
}
答案 0 :(得分:1)
is >> d.x >> d.y
不起作用,因为d
的类型为std::vector<point>
,而不是point
。 std::vector<point>
没有成员变量x
或y
。 point
可以。这些是句法问题。更为重要的问题是:如何通过从文件中读取对象来填充std::vector<point>
?
我可以想到以下选项:
不要假设在输入流中可以找到point
个对象。尽可能多地读取point
对象,并将它们添加到std::vector<point>
。
假定仅存在point
个对象的已知数量,这些对象可以进行硬编码或通过其他方式获得。在这种情况下,请阅读所有内容(假设它们可以成功读取),然后将其添加到std::vector<point>
中。
从流本身读取point
对象的数量。假设可以从流中读取point
的数量。然后,读取预期数量的point
对象(假设可以成功读取它们),并将它们添加到std::vector<point>
中。
在所有这些情况下,您都需要能够从流中读取point
。为此,我建议,
std::istream& operator>>(std::istream& is, point& p)
{
return is >> p.x >> p.y;
}
要从流中填充std::vector<point>
,必须从第二个参数中删除const
。您需要
std::istream& operator>>(std::istream& is, std::vector<point>& d)
{
// Implement the appropriate strategy here to read one point object
// at a time and add them to d.
// For the first strategy, you'll need:
point p;
while ( is >> p )
{
d.push_back(p);
}
}
答案 1 :(得分:0)
我认为,理想情况下,您应该将运算符重载功能作为朋友的功能。