C++: std::vector-Member des umgebenden Objekts in der Praxis
-
Hi,
laut C++-Standard ist ja Folgendes undefiniert oder verboten:
struct Whatever { std::vector<Whatever> var; };
Hat damit schon mal jemand mit einem Compiler Probleme gehabt? Soweit ich weiß, funktioniert es mit dem GCC (Version von vor ~halben Jahr) und dem Compiler von MSVC++2003, 2005 und 2008 problemlos.
Wie sieht's auf dem Mac aus, welche(n) Compiler verwendet man dort und könnte es da Probleme geben? Oder weiß jemand, wie der Digital Mars Compiler oder andere Compiler für Desktop-Systeme damit zurechtkommen?
-
Warum soll das verboten sein? Solange std::vector die Klasse selbst wieder nur als Referenz und Zeigerverwendet ist das doch OK.
-
Hm, ich meine im C++-Forum gab's mal ein oder zwei Threads darüber, dass man std::vector instantiieren darf, wenn der Template-Parameter schon vollständig deklariert ist. Also im Endeffekt, dass eine Klasse laut Standard keinen vector als Member haben darf mit sich selbst als Template-Parameter. Ich schaue mal, ob ich dazu wieder was finde :xmas2:
-
Wenn das verboten sein sollte, dann sind aber ganz schöne viele Libraries hinfällig. Libs wie ATL, WTL, Boost und auch TR1 machen sowas als Grundlage! Nicht direkt mit Vector, aber anderen templates! Da gibts dann solche netten Sachen im offiziellen TR1:
class Whatever : public std::tr1::enable_shared_from_this<Whatever> {};
Nicht viel anders als ein Vector als Member.
Also, bitte ein Zitat aus dem ISO-C++-Spezifiaktion vorlegen, dass das Verbot untermauert!
-
Bulli schrieb:
Wenn das verboten sein sollte, dann sind aber ganz schöne viele Libraries hinfällig. Libs wie ATL, WTL, Boost und auch TR1 machen sowas als Grundlage! Nicht direkt mit Vector, aber anderen templates!
Ach nein
Es geht aber konkret um std::vector<>. Lies den Threadtitel.Die Frage ist eher, ob std::vector z.B. mittels Small Size Optimization (analog zu Small String Optimization) implementiert werden darf; dann ergäbe sich u.U. diese Beschränkung (auch wenn man sie evtl. mit Placement New umgehen könnte).
-
Badestrand schrieb:
Hm, ich meine im C++-Forum gab's mal ein oder zwei Threads darüber, dass man std::vector instantiieren darf, wenn der Template-Parameter schon vollständig deklariert ist.:
Den Thread hatte ich auch gelesen, bin aber nicht der gleichen Meinung. Meines Erachtens ist die Deklaration vollständig, und nicht erst mit dem "};" am Ende der Klasse abgeschlossen. Sonst müsste ich ja auch bei Inlinefunktionen die Memberdeklaration vor der Funktion schreiben...
-
Ok, gut, danke euch! Dann gehe ich davon aus, dass kein halbwegs gängiger Compiler damit Probleme haben dürfte, Standard hin oder her
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum Compiler- und IDE-Forum in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
mammamia;