lückentext



  • weil die Konstruktoren sich gegenseitig aufrufen?



  • weil das objekt bei dir kleiner oder gleich groß ist wie eine rücksprungadresse und der stack kleiner als der heap.



  • YASC schrieb:

    weil die Konstruktoren sich gegenseitig aufrufen?

    Ja, aber ich dachte, ein Templateargument (als Typ) müsse zuerst deklariert worden sein und wusste nicht, dass es das bereits nach class impossible : sei.

    cloze schrieb:

    weil das objekt bei dir kleiner oder gleich groß ist wie eine rücksprungadresse und der stack kleiner als der heap.

    Das versteh ich jetzt nicht ganz; wieso Rücksprungadresse?
    Wenn ich keinen Speicher mit new allokiere, gibt es auch keinen Stack-Overflow...



  • Nexus schrieb:

    cloze schrieb:

    weil das objekt bei dir kleiner oder gleich groß ist wie eine rücksprungadresse und der stack kleiner als der heap.

    Das versteh ich jetzt nicht ganz; wieso Rücksprungadresse?

    ich meinte, dass die konstruktoren sich gegenseitig aufrufen, weil ständig neue objekte erzeugt werden. für diese rekursiven aufrufe muss eine rücksprungadresse auf den stack geschoben werden.
    wäre das objekt größer, würde vielleicht das millionste new mangels speicher fehlschlagen. aber bei diesem leeren objekt ist der stack mit den rücksprungadressen schneller gefüllt als der heap mit den objekten, deshalb stack overflow.



  • Nexus schrieb:

    ich dachte, ein Templateargument (als Typ) müsse zuerst deklariert worden sein und wusste nicht, dass es das bereits nach class impossible : sei.

    Soweit ich weiß muss der Typ auch (vollständig!) deklariert sein, deshalb ist das hier imho nicht standardkonform:

    struct foo
    {
        std::vector<foo> lots_of_foos;
    };
    


  • Ok, danke für die Erklärung. Wieder was gelernt 😉



  • Bei genau so einer Struktur hatte mich camper mal belehrt 🤡



  • Badestrand schrieb:

    Soweit ich weiß muss der Typ auch (vollständig!) deklariert sein, deshalb ist das hier imho nicht standardkonform

    Dachte ich eben zuerst auch. Es geht jedoch, wenn das Template nur Zeiger auf den Typen verwendet (was bei std::vector nicht der Fall ist). Nur dachte ich, dass die Klasse nach dem Vererbungsdoppelpunkt noch nicht einmal deklariert sei, was sich als Irrtum herausstellte.



  • Hallo,

    um ein Beispiel mit einzubringen:

    WTL und ATL basieren auf solchen Klassentemplates, um virtuelle Funktionen zu "simulieren", diese werden schon während des Kompilierens "aufgelöst". Wen es interessiert, der kann sich nur den Abschnitt "ATL-style templates" durchlesen, zu finden hier:

    http://www.codeproject.com/KB/wtl/wtl4mfc1.aspx#atltemplates

    MfG,

    Probe-Nutzer



  • Das ist ein recht weit verbreitetes Konzept und nennt sich Curiously Recurring Template Pattern


Anmelden zum Antworten