Перегрузка оператора << для вывода списка std :: - PullRequest
2 голосов
/ 10 августа 2011

У меня были некоторые проблемы при попытке реализовать перегруженную функцию оператора <<, которая может распечатать std :: list, который является членом одного из моих классов. Класс выглядит так: </p>

class NURBScurve {
  vector<double> knotVector;
  int curveOrder;
  list<Point> points;
public:
  /* some member functions */
  friend ostream& operator<< (ostream& out, const NURBScurve& curve);
};

Ключевой переменной-членом, которая меня интересует, является список «Точек» - это еще один созданный мной класс, в котором хранятся координаты точки вместе с соответствующими функциями-членами. Когда я пытаюсь реализовать перегруженную функцию оператора << как: </p>

ostream& operator<<( ostream &out, const NURBScurve &curve)
{
 out << "Control points: " << endl;
 list<Point>::iterator it;
 for (it = curve.points.begin(); it != curve.points.end(); it++)
    out << *it; 
 out << endl;
 return out;
}

У меня начинаются проблемы. В частности, я получаю следующую ошибку: ошибка:

no match for ‘operator=’ in ‘it = curve->NURBScurve::points. std::list<_Tp, _Alloc>::begin [with _Tp = Point, _Alloc = std::allocator<Point>]()’
/usr/include/c++/4.2.1/bits/stl_list.h:113: note: candidates are: std::_List_iterator<Point>& std::_List_iterator<Point>::operator=(const std::_List_iterator<Point>&)

Я немного озадачен, но я думаю, что это как-то связано с итератором списка, который я использую. Я также не слишком уверен в нотации кривой.points.begin ().

Если кто-нибудь сможет пролить свет на эту проблему, я был бы признателен. Я нахожусь в точке, где я слишком долго смотрю на проблему!

Ответы [ 2 ]

9 голосов
/ 10 августа 2011

curve является const-квалифицированным, поэтому curve.points является const-квалифицированным и curve.points.begin() возвращает std::list<Point>::const_iterator, а не std::list<Point>::iterator.

Контейнеры имеют две функции-члена begin() и end(): одна пара не является константными функциями-членами и возвращает iterator с, другая пара является константной и возвращает const_iterator с. Таким образом, вы можете перебирать контейнер, который не является const, и читать и изменять элементы в нем, но вы также можете перебирать контейнер const с доступом только для чтения.

6 голосов
/ 10 августа 2011

Или

Вы можете использовать std::copy как:

std::copy(points.begin(), points.end(), 
                      std::ostream_iterator<Point>(outStream, "\n"));

Убедитесь, что подпись operator<< такова:

std::ostream & operator <<(std::ostream &out, const Point &pt);
                                            //^^^^^ note this
...