Wie kann ich BOOST_FOREACH mit einem Container verwenden, der nur const_iterator unterstützt?

8

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:

%Vor%

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 :

%Vor%     
mark 12.01.2012, 13:11
quelle

4 Antworten

6

Ein Work-around , wenn Sie wirklich vermeiden wollen, dass das iterator -Member ein Paar Iteratoren verwendet.

%Vor%     
kennytm 12.01.2012, 13:18
quelle
5

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.

    
Bo Persson 12.01.2012 13:16
quelle
0

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?

    
Mark Ingram 12.01.2012 13:15
quelle
0

Mit Boost 1.52 (ich habe nicht mit anderen Versionen getestet) funktioniert BOOST_FOREACH(Field field, const_cast<Row const&>(row)) auch.

    
Renato Garcia 24.03.2013 23:51
quelle

Tags und Links