Definition eines statischen template-struct-members



  • mh, mit einer einfach verketteten liste kann man eh nur halbwegs effizient einen stack implementieren, also eine liste wo man nur zugriff auf das oberste element hat (einfügen, löschen, wert angucken). da finde ich die namen "next" was doof gewählt, da man ja eigentlich immer nur auf den vorgänger "runter" schaut

    und wenn du 2 zeiger für prev und next haben willst, hast du eh eine doppelt verkettete liste. aber statisch hat in jedem fall nix da zu suchen.

    wie jaxom schon sagte, guck dir nochmal die semantik von static an...



  • LordJaxom schrieb:

    Ich glaube Du hast "statisch" falsch verstanden: Es gibt nur ein "prev" im gesamten Programm.

    Das ist mir schon klar.

    LordJaxom schrieb:

    Das heißt jedes Element Deiner Liste hätte denselben Vorgänger. Und irgendein Element Deiner Liste wäre der Vorgänger von allen anderen Elementen.

    Wie gesagt, ich brauche prev nur, um die Adresse des Vorgängers zu speichern, damit ich nochmal beim Erzeugen des nächsten Nodes drauf zugreifen kann. Dass der beim nächsten Node wieder überschrieben wird, ist von mir gewünscht.
    Genausogut hätte ich können eine globale Variable nehmen oder den Vorgängernode dem Konstruktor übergeben können.



  • Ok, verstanden. Wenn auch sehr sehr unüblich. Aber Dir ist auch bewusst, dass Du Dir damit die Möglichkeit verbaust, mehr als eine Liste zu verwalten?

    Zum Problem:
    "node" kommt in der Definition zweimal vor. Beide Vorkommen sind Templates. Also müssen bei beiden Vorkommen Templateargumente angegeben werden, um einen Typen zu erhalten.



  • LordJaxom schrieb:

    Ok, verstanden. Wenn auch sehr sehr unüblich. Aber Dir ist auch bewusst, dass Du Dir damit die Möglichkeit verbaust, mehr als eine Liste zu verwalten?

    Im Prinzip gings mir nur darum, ein bisschen "static zu üben" :D.

    LordJaxom schrieb:

    Zum Problem:
    "node" kommt in der Definition zweimal vor. Beide Vorkommen sind Templates. Also müssen bei beiden Vorkommen Templateargumente angegeben werden, um einen Typen zu erhalten.

    Also so?:

    template <typename T>
    node<T> *node<T>::prev = 0;
    

    Leider kommt da wieder der selbe Fehler 😞



  • Es gibt noch mehr Vorkommen von node ohne Templateargumentliste in deinem Code. Schau dir mal Zeile 9 und 10 an.


  • Mod

    wxSkip schrieb:

    Es gibt noch mehr Vorkommen von node ohne Templateargumentliste in deinem Code. Schau dir mal Zeile 9 und 10 an.

    Das ist dort aber kein Fehler.



  • So müsste es doch eigentlich stimmen oder?

    #include <iostream>
    #include <vector>
    
    namespace linkedlist
    {
    template <typename T>
    struct node
    {
        T val;
        node *next;
        static node *prev;
    
        node(): val(0), next(0) {}
        node(T v): val(v), next(0) {
            if (prev != 0)
                prev->next = this;
            prev = this;
        }
    };
    template <typename T>
    node *node<T>::prev = 0;
    
    }
    
    int main()
    {
        using namespace linkedlist;
        node<char> x('S');
        node<char> y('R');
        node<char> z('1');
        for (;; x = *x.next) {
            std::cout << x.val;
            if (!x.next) break;
        }
        return 0;
    }
    

    Funktioniert aber nicht 😞

    EDIT: Es muss irgendwie am Pointer liegen. Wenn ich ein normales static node deklariere, kann ich es auch definieren.



  • Das Problem hat sich erledigt.

    template <typename T>
    struct node
    {
        T val;
        node *next;
        static node<T> *prev;
    
        node(): val(0), next(0) {}
        node(T v): val(v), next(0) {
            if (prev != 0)
                prev->next = this;
            prev = this;
        }
    };
    template <typename T> node<T> *node<T>::prev = 0;
    

    Funktioniert.



  • mortified_penguin schrieb:

    Das Problem hat sich erledigt.

    Wundert mich - dass es vorher nicht funktioniert haben soll. Ist nämlich der selbe Code (der Zeilenumbruch ist wurscht).

    Zum "static üben" solltest du ein Übungsbeispiel verwenden, wo static sinn macht. In deinem Fall macht es keinen Sinn und führt spätestens bei mehreren Threads zu fehlerhaftem Verhalten.



  • Mach dat static-Dingen weg. So kannst Du nur eine einzige Liste verwenden. Das geht auch besser.


Anmelden zum Antworten