Ich habe diesen Container:
%Vor%Vorausgesetzt, dass der folgende Code gut kompiliert:
%Vor% Allerdings sollte die Klasse Row
nicht den änderbaren Iterator haben, also habe ich die Klasse Row geändert, indem ich den veränderbaren Zugriff entfernt habe:
Aber jetzt kann die gleiche foreach-Schleife nicht kompilieren:
%Vor% Aus der Fehlermeldung verstehe ich, dass BOOST_FOREACH
versucht, einen range_mutable_iterator
-Typ zu instanziieren, was offensichtlich fehlschlägt. Wie kann ich stattdessen den konstanten Bereich instanziieren?
Danke.
BEARBEITEN
Hier sind die vollständigen Klassendeklarationen für Row
und FieldIterator
:
Was war mit Ihrem Originalcode falsch?
Einige der Standardbibliothekscontainer, wie std::set
und std::multiset
, haben Iteratoren, die alle const sind (keine Aktualisierung erlaubt). Der Standard sagt konkret:
Für assoziative Container wo Der Werttyp ist derselbe wie der Schlüsseltyp, sowohl Iterator als auch Const_iterator sind konstante Iteratoren. Es ist nicht angegeben, ob Iterator und Const_iterator vom selben Typ sind oder nicht.
Sie würden wahrscheinlich mit
davonkommen %Vor%in Ihrer Klasse.
FieldIterator
scheint die gleiche Iterator-Klasse für const und nicht-const Iterator-Methoden zu sein. BOOST_FOREACH
funktioniert mit jedem Container, einschließlich C-artigen Arrays, was mich zu der Annahme verleitet, dass das Problem in der Klasse FieldIterator
liegt. Können Sie den Code dafür veröffentlichen?
Mit Boost 1.52 (ich habe nicht mit anderen Versionen getestet) funktioniert BOOST_FOREACH(Field field, const_cast<Row const&>(row))
auch.
Tags und Links c++ boost boost-foreach