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 mitnewallokiere, 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::vectornicht 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