Problem: Eigener Iterator
-
Hallo
Ich probiere gerade zur Übung ein einfaches array-Klassentemplate zu schreiben, mit eigenem Iterator. Ich habe den Ansatz gewählt, dass der Iterator eine Sub-Klasse der Array-Klasse ist. Dabei hat ein Iterator-Objekt einen pointer auf ein Array-Objekt sowie eine Position, die sagt auf welchem Element er sich befindet. Jetzt ist ein Problem in einer Methode der Array-Klasse aufgetaucht, wo der Compiler Motzt. Es handelt sich um die Methode, die ein Iterator-objekt auf das erste Array-Element zurück geben soll (die Funktion auf Zeile 89). Der Compiler meldet folgendes:
89 E:\Daten\devcpp\cpp test\array.h expected constructor, destructor, or type conversion before "Array"
89 E:\Daten\devcpp\cpp test\array.h expected `;' before "Array"Kann mir jemand sagen was ich falsch mache?
Gruss
#ifndef ARRAY_H #define ARRAY_H template <class T> class Array { public: // forward declaration class Iterator; // constructor Array(unsigned int size); // destructor ~Array(); // resize array void Resize(unsigned int size); // access array element T& Access(unsigned int index); // get array size unsigned int Size(void); // get iterator at first element Iterator Start(void); // iterator sub-class class Iterator { public: // constructor Iterator(); // destructor ~Iterator(){} private: // pointer to array for access Array<T> *m_p_array; // iterator position unsigned int m_position; }; private: T *m_data; int m_size; }; // array implementation template <class T> Array<T>::Array(unsigned int size) { m_data = new T[size]; memset(m_data, 0, size * sizeof(T)); m_size = size; } template <class T> Array<T>::~Array() { delete[](m_data); } template <class T> void Array<T>::Resize(unsigned int size) { T data2 = new T[size]; memcpy(data2, m_data, size * sizeof(T)); m_size = size; delete[](m_data); m_data = data2; } template <class T> T& Array<T>::Access(unsigned int index) { return m_data[index]; } template <class T> unsigned int Array<T>::Size(void) { return m_size; } template <class T> Array<T>::Iterator Array<T>::Start(void) { Iterator iter; iter.m_p_array = this; iter.m_position = 0; return iter; } // array::iterator implementation template <class T> Array<T>::Iterator::Iterator() { m_position = 0; } #endif
-
versuch mal das Schlüsselwort "typename"
template <class T> typename Array<T>::Iterator Array<T>::Start(void) { // ... }
-
Th schrieb:
versuch mal das Schlüsselwort "typename"
template <class T> typename Array<T>::Iterator Array<T>::Start(void) { // ... }Wirkt Wunder! Danke.
