重载输出运算符<<以使用 STL 列表迭代器

Overload the output operator << to work with STL list iterator

本文关键字:lt STL 列表 迭代器 输出 重载 运算符      更新时间:2023-10-16

我有一个Point2D类

Point2D

class Point2D
{
 public:
           int getX() const;
           int getY() const;
           void setX(int);
           void setY(int);
 protected:
             int x;
             int y;
};

我正试图使输出运算符<lt;要使用Point2D迭代器p2d_list.begin(),但我不确定如何做到这一点,这是我的尝试

ostream& operator<< (ostream& afile, Point2D* p2)
{
               afile<<left
                    <<setw(1)
                    <<"["
                    <<left
                    <<setw(5)
                    <<p2->getX()
                    <<" ,"
                    <<left
                    <<setw(5)
                    <<p2->getY()
                    <<" ]    "
                    <<left
                    <<setw(6)
                    <<p2->getScalarValue()
                    <<endl;
                return afile;

}

在我的主要功能

int main()
{
   list<Point2D> p2d_list;
   list<Point2D>::iterator p2 = p2d_list.begin();
        while ( p2 != p2d_list.end() )
        {
            cout<<p2; //error here
            p2++;
        }
}

我收到以下错误

错误C2679:二进制'<lt;':找不到接受类型为"std::_List_iterator&lt_Mylist>'(或者没有可接受的转换)

如何重载输出运算符<lt;以便它与Point2D迭代器**p2d_list.begin()

一起工作

您正在尝试输出iterator,而不是Point2D。您应该先取消引用迭代器。在你的情况下,它应该是

cout << &(*p2);

,但我不知道为什么您的operator <<接收指针,而不是ref/cont-ref。应该是

ostream& operator<< (ostream& afile, const Point2D& p2)

然后输出应该是

cout << *p2;

您需要为list<Point2D>::iterator类型而不是Point2D* 重载运算符

ostream& operator<< (ostream& afile, list<Point2D>::iterator &p2)
{
           afile<<left
                <<setw(1)
                <<"["
                <<left
                <<setw(5)
                <<(*p2)->getX()
                <<" ,"
                <<left
                <<setw(5)
                <<(*p2)->getY()
                <<" ]    "
                <<left
                <<setw(6)
                <<(*p2)->getScalarValue()
                <<endl;
            return afile;

}