<< - Operator überschreiben



  • Hallo!

    Ich bekomme einen Compile-Fehler (Zeile 70) und kann nicht verstehen was da falsch ist. Könnte bitte jemand Helfen?

    Danke schon mal.

    #ifndef __STACK_INCLUDED__
    #define __STACK_INCLUDED__
    
    #include <iostream>
    #include <list>
    #include "EmptyStackException.h"
    
    template<class T>
    /**
     * Implementiert einen Stack mit Hilfe der generischen
     * STL-Klasse <code>list</code>.
     */
    class Stack {
    
    private:
    	/**
    	 * enthaelt die Elemente.
    	 */
    	std::list<T> stack;
    
    public:
    
    	/**
    	 * Prueft ob Stack leer ist oder nicht
    	 * @return 1 wenn Stack leer ist.
    	 **/
    	bool empty() {
    		return stack.empty();
    	}
    
    	/**
    	 * Gibt das oberste Stack element als Referenz zurueck.
    	 * @return referenz auf das oberste Element.
    	 **/
    	T& peek() {
    		//wenn stack nicht leer ist
    		if (!stack.empty()) {
    			return stack.back();
    		} else {
    			throw EmptyStackException();
    		}
    	}
    
    	/**
    	 * Entfernt das oberste Element vom Stack
    	 **/
    	void pop() {
    		//wenn stack nicht leer ist
    		if (!stack.empty()) {
    			stack.pop_back();
    		} else {
    			throw EmptyStackException();
    		}
    	}
    
    	/**
    	 * legt ein neues Element auf den stack.
    	 * @param value das neue Element
    	 **/
    	void push(T value) {
    		stack.push_back(value);
    	}
    
    	/**
    	 * Ueberschreibt << (cout) Operator.
    	 */
    	friend std::ostream& operator<<(std::ostream& out, const Stack& stackSrc) {
    		std::list<T>::iterator it; // HIER FEHLER!
    		for(it = stackSrc.stack.end(); it != stackSrc.stack.begin(); it--){
    			std::cout << *it << std::endl;
    		}
    		return out;
    	}
    };
    #endif
    


  • 1. poste bei so was doch bitte auch immer den fehler mit

    2. der fehler kommt nicht hier std::list<T>::iterator it; // HIER FEHLER! sondern wirklich in Zeile 70.
    Dazu musst du aber diese Zeile ändern, in:
    std::list<T>::const_iterator it;
    du hast ein konstantes objekt - kannst also keine nicht const-funktionen aufrufen.
    und std::list<T>::iterator std::list<T>::begin() ist nun mal nicht const - std::list<T>::const_iterator std::list<T>::begin() const aber 🙂

    bb

    PS:

    1. __STACK_INCLUDED__ schlechter include name - alles mit 2 unterstrichen am stück oder unterstrich großbuchstabe am anfang ist für den compiler reserviert - ohne einschränkungen.
      2. es gibt bereits eine klasse std::stack ( #include <stack> ), weist du das?


  • Das Thema kam erst gestern - da muss typename vor std::list<T>::iterator hin.



  • wxSkip schrieb:

    Das Thema kam erst gestern - da muss typename vor std::list<T>::iterator hin.

    stimmt - das typename braucht man auch noch(zumindest normalerweise, der msvc sollte es nicht brauchen) - aber nichts destro trotz muss da nen const_iterator hin...

    bb



  • ok

    typename std::list<T>::const_iterator it;
    

    was macht dieses typename in dem fall genau?



  • es sagt dem compiler, dass es sich um einen typen handelt und nicht um eine (static) variable

    bb




Anmelden zum Antworten