Warum arbeitet mein benutzerdefinierter Iterator nicht mit der STL-Kopie?

8

Ich habe einen OutputIterator für eine Antwort auf eine andere Frage . Hier ist es:

%Vor%

Das funktioniert gut für diese kleine Kopierfunktion:

%Vor%

Aber es funktioniert überhaupt nicht für die STL copy from algorithms . Hier sind die wunderbaren C ++ - Fehler, die ich bekomme:

%Vor%

Hier ist der Treiber:

%Vor%

Warum spezialisiert sich die Welt auf iterator_traits ? Was ist falsch an meinem Iterator? Kann ich nicht einfach meine eigenen einfachen Iteratoren schreiben?

    
Frank Krueger 12.11.2009, 17:35
quelle

4 Antworten

17

Ihr queue_inserter muss von std::iterator abgeleitet werden, damit alle Typdefinitionen wie value_type korrekt definiert werden, da diese in STL-Algorithmen verwendet werden. Diese Definition funktioniert:

%Vor%     
Naveen 12.11.2009, 17:40
quelle
8

Leite es von std :: iterator ab. Wenn Sie interessiert sind, hat der Dr. Dobb einen Artikel über benutzerdefinierte Container und Iteratoren.

    
grigy 12.11.2009 17:42
quelle
6

Ihr Iterator erfüllt nicht die Anforderung für einen 'zuweisbaren' Typ, der eine Voraussetzung für einen Ausgabe-Iterator ist, da er eine Referenz und zuweisbare Typen enthält, um sicherzustellen, dass nach t = u das t gleich% co_de ist %.

Sie können eine geeignete Spezialisierung für u für Ihren Iterator entweder durch Ableiten von einer Spezialisierung von iterator_traits oder durch explizites Bereitstellen einer Spezialisierung bereitstellen.

%Vor%     
Charles Bailey 12.11.2009 17:55
quelle
4
%Vor%

Dies sollte mit iterator_traits geschehen; eine Hilfsstruktur in <iterator> , die alle Typen definiert, die ein Iterator typischerweise definieren sollte. Funktionen in <algorithm> , beziehen Sie sich bei Bedarf auf diese Typen wie iterator_traits<it>::iterator_category oder sagen iterator_traits<it>::value_type usw. Wenn Sie sie nur innerhalb eines benutzerdefinierten Iterators definieren würden, wäre das der Trick. Dies ist die moderne Art, Iteratoren zu schreiben, im Gegensatz zur klassischen Art, von std::iterator zu erben. Ein Blick auf <iterator> zeigt, dass sogar std::iterator diese Typen definiert, d. H. Iterator_category, difference_type usw. Dies ist der Grund dafür, dass die abgeleitete Iterator-Klasse, wenn sie von std::iterator geerbt wird, diese aufgrund von Vererbung erhält.

    
legends2k 22.09.2011 20:06
quelle

Tags und Links