2013-11-19 4 views
0

У меня есть класс Point2DПерегрузка оператора вывода << работать со списком STL итераторов

Point2D

class Point2D 
{ 
public: 

      int getX() const; 
      int getY() const; 

      void setX(int); 
      void setY(int); 

protected: 

      int x; 
      int y; 

}; 

Я пытаюсь перегружать выходной оператор < < работать с 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: бинарный «< <»: ни один оператор не найден, который принимает правый операнд типа «станд :: _ List_iterator < _Mylist>»(или нет приемлемой конверсии)

Как я перегрузить оператор вывода < < так, что он работает с Point2D итератора ** p2d_list.begin()

ответ

2

Вы пытаетесь вывести iterator, а не Point2D. Сначала вы должны разыменовать итератор. В вашем случае это должно быть

cout << &(*p2); 

, но я понятия не имею, почему ваш operator << получает указатель, вместо исх/Const-реф. Он должен быть

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

, а затем выход должен быть

cout << *p2; 
+0

какие изменения я должен сделать для функции перегрузки? ? и как я должен cout ?? – Computernerd

+0

@Computernerd использует '.' вместо' -> 'при обращении к полям объекта. Это все. – ForEveR

+0

это не работает. Я получаю ту же ошибку: Ошибка C2679: двоичный '<<': оператор не найден, который принимает правый операнд типа «Point2D» (или нет приемлемого преобразования) – Computernerd

0

Вам необходимо перегрузить оператор для 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; 


} 
Смежные вопросы