011
04.09.2003, 12:01 Uhr
virtual
Sexiest Bit alive (Operator)
|
Inhaltlich sind class und typename an dieser Stelle komplett austauschbar. Ich persönlich bevorzuge typename, wenn als Templateparameter auch keine Klassen übergeben werden können oder der Templateparameter ein eingebauter Datentyp sein soll; class hingegen, wenn eine Klasse erwartet wird. Aber wie gesagt: wird nicht weiter ausgewrtet; ist egal ob typename oder class an dieser Stelle.
typename hat jedoch eine besondere Bedeutung in anderen Kontext. Nehmen wir mal (in der STL häufigen Fall):
C++: |
template<class T> class Something { public: typedef int size_type; ... size_type getSize(); }; ... template<class C> void f(C& cont) { C::size_type n = cont.getSize(); }
|
Was haben wir gemacht: Zunächst haben wir eine Templateklasse cont deklariert und dann dort einen Neuen Typen size_type Eingeführt. Das ganze wollen wir in einer Templatefunktion anwenden. Zwar sieht man als Mensch nahezu sofort, daß mit C::size_type ein Datentyp gemeint ist, Ein compiler sieht das jedoch nicht. Ähnliches gilt auch für dieses Unscheinbare Ding hier:
C++: |
template<class C> void f(C& cont) { C::func(var); // Was ist das }
|
Das könnte man als Funktionsaufruf sehen, aber eben auch als Dekalration einer Variablen namens var vom Typen C::func (Die Klammern wären also nur redundanter Unsinn). Um solcherlei Zweideutigkeiten auszuschliessen, wiurd das typename Keywort eingeführt:
C++: |
template<class C> void f(C& cont) { typename C::func(var); // Deklaration einer Variablen }
|
Solche Effekte können nur im Zusammenhang mit Templates auftreten, dh genereall wird man das typename nur dann sinnvoll einsetzen. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |