Iterator für Klasse implementieren
-
Hi, ich möchte für meine Klasse MyClass einen Iterator implementieren. Allerdings geht der folgende Code schon nicht, weil wie ich vermute wohl MyIterator auch dem globalen namespace bekannt sein muss. Was muss ich abändern damit es funktioniert?
class Iterator { }; template<class T> class MyClass { public: typedef Iterator MyIterator; MyIterator GetIterator(); }; template<class T> MyIterator MyClass<T>::GetIterator() { return MyIterator(); }
-
class Iterator { }; template<class T> class MyClass { public: typedef Iterator MyIterator; MyIterator GetIterator(); }; template<class T> typename MyClass<T>::MyIterator MyClass<T>::GetIterator() { return MyIterator(); } int main() {}
-
Danke dir, funktioniert jetzt.
-
Eigene Iteratoren bauen ist auch viel Schreibarbeit. Da kann man sich einiges sparen mit der Boost.Iterator-Bibliothek.
-
Hi, nochmal ein Problem. Und zwar erzeugt das Typedef in der MyContainer-Klasse einen Fehler. Jemand eine Idee ob man das zum Laufen bekommen kann?
template <typename T, template<typename> class U> class Iterator : public Object { public: Iterator<T, U>(); }; template <typename T, template<typename> class U> Iterator<T, U>::Iterator() { } template<class T> class MyContainer { public: // Die folgende Zeile erzeugt einen Fehler // error C3200: 'MyContainer<T>': Ungültiges Vorlagenargument für den Vorlagenparameter 'U'; Klassenvorlage erwartet typedef Iterator<T, MyContainer> MyIterator; };
-
Was soll denn das werden?
-
Wie man am typedef sehen kann möchte ich eine Iterator Klasse haben der man sowohl den VariablenTyp T als auch den Containertyp U übergeben können soll.
Damit würde ich mir die von krümelkacker erwähnte Schreibarbeit sparen da die Klasse für alle meine Arraybasierten Container verwendet werden kann.
-
Also im gcc gehts so: http://ideone.com/WBF1h
Vielleicht hilft eine Vorwärtsdeklaration von MyContainer.
-
Mhh, ist ja merkwürdig. Mit Vorwärtsdeklaration für MyContainer geht es (unter Visual Studio 2010) leider auch nicht.
-
So oder so sieht's recht komisch aus, was Du aufgeschrieben hast. Man kann Dir aber keine besseren Alternativen vorstellen, weil Du zu wenig Informationen gegeben hast.