Listen mit Templates



  • Hallo zusammen,

    habe ein Template-Problem und die Lösung in den anderen Beiträgen nicht gefunden.
    Ich will eine (einfach verkettete) Liste als Template implementieren, dabei soll es eine Listen-Klasse und eine Listen-Element-Klasse geben. Die Listen-Klasse soll die Operationen auf der Liste enthalten (einfügen...) und das Listen-Element einen Zeiger auf das nächste Element, sowie irgendein Datum.

    template<class T>
    class Liste  
    {
    public:
       // Konstruktor und Destruktor
       Liste();
      ~Liste();
       void InsertElementAtPosition(Listelement<T> element, int position);
       ...
    private:
       // Zeiger auf Liste
       ListElement<T>* m_pAnker;
    };
    // Hier steht jetzt die Implementierung der Liste
    
    template <class T>
    class ListElement  
    {
    public:
       ListElement();
      ~ListElement();
    
       T GetData();
       void SetData(T data);
       ListElement<T>* GetNext();
       void SetNext(ListElement<T>* pNext);
    
    private:
       ListElement* m_pNext;
       T m_Data;
    };
    // Hier die Implementierung des Listenelements
    

    Der Compiler (VC++) beschwert sich mit folgenden Meldungen:

    Vorlagendefinitionen koennen nicht verschachtelt werden

    Ist das von der Idee her "schön", oder würde man das eher anders
    schreiben??

    Herzlichen Dank...
    ...vom Sonnenschein



  • Der Compiler (VC++) beschwert sich mit folgenden Meldungen:

    Vorlagendefinitionen koennen nicht verschachtelt werden

    Man könnte dir weitaus einfacher helfen, wenn du das tatsächliche Problem posten würdest. Also den Codeteil, der vom VC++ beanstandet wird.



  • Hi,

    ich würde für die Listenelemente nicht gleich eine eigene Klasse aufmachen. Mach Dir doch ein struct in Deiner Listenklasse.

    template<class T>
    class liste{
    
        public:
            struct element{
                 T inhalt;
                 element *p_next;
            };
    
           ....
           ....  
    
        private:
           element *p_anker;
    
    };
    

    PS: Sag mal, gehst Du auf die Technikerschule in München? Dort war das grad in einem C++ Kurs dran, und der Lehrer hat das fast genau so aufgemacht.

    grüße Con@n

    [ Dieser Beitrag wurde am 21.05.2003 um 12:39 Uhr von Con@n editiert. ]



  • Ja, der gepostete Codeteil wird beanstandet...
    Irgendwas, was ich nicht sehe, ist falsch daran.



  • Ja, der gepostete Codeteil wird beanstandet...
    Irgendwas, was ich nicht sehe, ist falsch daran.

    Ich kann dir genau sagen was damit nicht stimmt:
    1. InsertElementAtPosition hat einen Parameter vom Typ Listelement<T>. Ein solcher Typ wurde aber nirgends deklariert. Es fehlt also mindestens eine forward-declaration.
    Listelement<T> soll wohl außerdem ListElement<T> heißen.

    2. Die drei Punkte "..." sind kein gültiger Identifier in C++

    3. Du deklarierst m_pAnker; vom Typ ListElement<T>*. Ein solcher Typ wurde aber nirgends deklariert. Es fehlt also mindestens eine forward-declaration.

    Ich kann mir allerdings nicht vorstellen, dass das dein wirkliches Problem ist.
    Nix davon hat schließlich mit "verschachtelten Vorlagendefinitionen" zu tun.

    Mach Dir doch ein struct in Deiner Listenklasse.

    Das "in deiner Listenklasse" halte ich für einen guten Vorschlag. Warum du aber gegen eine class bist bzw. wo der Vorteil einer struct liegt ist mir jetzt nicht klar.



  • Hi,

    @HumeSikkins
    mist, altes C denken. Ist natürchlich egal, ob Struct oder Klasse.

    grüße Con@n



  • mmh, ich würde gerne eine eigene Klasse für die Elemente haben, weil ich
    hinterher in den Elementen wieder Listen verwende und mir dann vermutlich die
    restliche Übersicht verloren geht 🙄
    Siehst Du denn hier den Fehler??



  • wie mache ich so eine forward-Deklaration???



  • Mein Code sieht beispielsweise so aus:

    template <class T>
    T ListElement<T>::GetData()
    {
       return m_Data;
    }
    template <class T>
    void ListElement<T>::SetNext(ListElement<T>* pNext)
    {
       m_pNext = pNext;
    }
    

    dazu sagt der Compiler außerdem noch:
    Vorlagenfunktion wurde bereits definiert



  • wie mache ich so eine forward-Deklaration???

    template <class T> class ListElement;
    

    Das ganze muss also so aussehen:
    1. forward-Deklaration ListElement
    2. Klassendefinition List
    3. Klassendefinition ListElement
    4. Implementation ListElement
    5. Implementation List

    oder alternativ:
    1. Klassendefinition und Implementation ListElement
    2. Klassendefinition und Implementation List


Anmelden zum Antworten