2011-08-10 5 views
2

J'ai eu quelques problèmes en essayant d'implémenter une fonction d'opérateur surchargée < < qui peut imprimer une liste std :: qui est membre d'une de mes classes . La classe ressemble à ceci:Surcharge de l'opérateur << pour imprimer une liste std ::

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

La variable clé de membre Je suis intéressé par la liste des « points » - ceci est une autre classe que j'ai créé qui stocke les coordonnées d'un point ainsi que des fonctions de membres associés. Lorsque je tente de mettre en œuvre la fonction surchargée < < de l'opérateur:

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; 
} 

je commence à avoir des problèmes. Plus précisément, je reçois l'erreur suivante: erreur:

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>&) 

Je suis un peu perplexe, mais je crois qu'il a quelque chose à voir avec la liste iterator J'utilise. Je ne suis pas trop confiant avec la notation de curve.points.begin().

Si quelqu'un peut faire la lumière sur le problème, je l'apprécierais. Je suis au point où je regarde le problème depuis trop longtemps!

+0

Vous pouvez donner ([assez imprimante] http://stackoverflow.com/questions/4850473/pretty-print-c-stl-containers) un essai :-) –

Répondre

9

curve est const qualifié, donc curve.points est const qualifié et curve.points.begin() retourne un std::list<Point>::const_iterator, pas std::list<Point>::iterator.

conteneurs ont deux begin() et end() fonctions membres: une paire ne sont pas des fonctions membres const qualifié et revenir iterator s, l'autre paire sont const qualifié et revenir const_iterator s. De cette façon, vous pouvez itérer sur un conteneur qui n'est pas const et à la fois lire et modifier les éléments, mais vous pouvez également itérer sur un conteneur const avec un accès en lecture seule.

+0

Je ne sais pas comment vous avez répondu aussi vite que vous, mais vous avez tout à fait raison, et cela a fi xed mon problème. Je suppose que cela a mis en évidence mon manque de compréhension de la bibliothèque std, mais je vais continuer à craquer ... Merci! –

6

Ou,

Vous pouvez utiliser std::copy comme:

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

Assurez-vous que la signature de operator<< est la suivante:

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