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. 🙂


Anmelden zum Antworten