007
21.10.2005, 14:23 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zitat von xenayoo: |
Kurze Frage noch:
Dein letzer dirty Tricky ist in einer Template-Klassen-Definition untergebracht. Wenn ich das Ganze 1:1 in einer Template-Funktion unterbringe, was passiert dann? Eine Funktion wird ja nicht "instanziert".
|
Was mr noch einfällt: Der Begriff "Instantiierung" ist in gewisser weise doppelt belegt: Läßt man mal Template beiseite, so spricht man von Instantiierung, wenn zu einer vorhandenen Klasse ein Objekt angelegt wird. Nimmt man Templates hinzu, gehen manche Leute hin und bezeichnen die Konkretisierung eines Templates hin zu einem Typen ebenfalls als "instantiierung". Zu verdeutlichung:
C++: |
template <typename T> T abs(const T& a) { return a>0?a:-a; }
|
Ist zunächstmal nur ein Template, also eine Vorlage. Ein Kompiler kann unmöglich wissen, was dem Benutzer so alles für "T" einfallen mag. Daher kann der Kompiler für dieses Template auch erstmal garkeinen Code generieren. Erst, wenn Du konkret sagst:
C++: |
int i = -4711; int j = abs(i);
|
Dann weiß der Kompiler: "oh, in der zweiten Zeile wird ja abs verwendet, und zwar für ein T = int." Daraufhin - das kann man sich vereoinfachend so vorstellen - geht der Compiler hin, nimmt das Template und ersetzt alle Ts durch "int" und compiliert diese Funktion. (Gleiches Gilt mit Klasse). Denn erst jetzt weiß der Compiler konkret (daher Konkretisierung), was das T eigentlich ist.
Genau bei dieser Konkretisierung würde der Compiler über solche Hacks wie im Post zuvor stolpern: In meinem Beispiel würde es sageb: "Hopsa, ein Array negativer Größe (denn das macht das Typedef ja) kann ich nicht darstellen."
Mir scheint, du meinst mit Instantiierung das erstgenannte; dies spielt hier jedoch keine Rolle. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |