templates: Unterschied zwischen class und typename?
-
Was ist eigentlich der Unterschied zwischen class und typename bei templatedefinitionen?
Diese beiden Codes bringen das gleiche Ergebnistemplate<class T,int i> struct { T Array[i]; };
template<typename T,int i> struct { T Array[i]; };
Was ist der Unterschied? Was ist besser?
-
-
Kurz: es gibt keinen wirklichen Unterschied, dem Compiler ists bei templates egal ob du typename oder class schreibst. Es gibt allerdings eine Reihe Autoren die es bei sich zur Konvention gemacht haben, typename da zu verwenden, wo wirklich beliebige Typen verwendet werden können (z.B. bei Containern), während class andeutet dass es sich um eine Klasse handeln muss, die bestimmte Voraussetzungen erfüllen muss (z.B. bei Policy classes, Allokatoren, Komparatoren usw.) Solche konventionen sind aber nicht bindend und es kann wirklich jeder machen wie ihm beliebt.
-
Ist cppreference.com dem Standard entsprechend?
int main(void) { // (void) .... }
-
Ja, void als "Parameter" ist bei C++ äquivalent zu ().
In C entspricht () (...), es können also beliebig viele Parameter übergeben werden.
-
Ach so, danke sehr.
-
Danke!
-
Es gibt aber doch einen Unterschied (Stickwort: Templatetemplates):
template<typename T, template<typename, typename> class CONT> class Foo { CONT<T, std::allocator<T>> m_Container; // ... }
Hier geht es nur mit class beim zweiten template parameter, oder?
Grüssli
-
Dravere schrieb:
Es gibt aber doch einen Unterschied (Stickwort: Templatetemplates):
template<typename T, template<typename, typename> class CONT> class Foo { CONT<T, std::allocator<T>> m_Container; // ... }
Hier geht es nur mit class beim zweiten template parameter, oder?
Grüssli
Du meinst mit typename sonst hätte es:
template<typename T, template<class, class> class CONT> class Foo { CONT<T, std::allocator<T>> m_Container; // ... }
heißen müssen.
Gruß
Markus
-
Dravere schrieb:
Hier geht es nur mit class beim zweiten template parameter, oder?
Um anzuzeigen, dass der Parameter ein Klassentemplate ist, ja. Ein wenig könnte man sich wundern, dass an dieser Stelle nicht auch struct oder union zulässig ist.