613 Stimmen

Verwenden Sie 'class' oder 'typename' für Vorlagenparameter?

Mögliches Duplikat:
C++ Unterschied der Schlüsselwörter 'typename' und 'class' in Vorlagen

Wenn man eine Funktions- oder Klassenvorlage in C++ definiert, kann man das so schreiben:

template <class T> ...

oder man kann dies schreiben:

template <typename T> ...

Gibt es einen guten Grund, das eine dem anderen vorzuziehen?


Ich habe die populärste (und interessanteste) Antwort akzeptiert, aber die wirkliche Antwort scheint zu lauten: "Nein, es gibt keinen guten Grund, das eine dem anderen vorzuziehen."

  • Sie sind gleichwertig (außer wie unten angegeben).
  • Manche Menschen haben Gründe, immer die typename .
  • Manche Menschen haben Gründe, immer die class .
  • Manche Menschen haben Gründe, beides zu verwenden.
  • Manchen Leuten ist es egal, welche sie benutzen.

Beachten Sie jedoch, dass vor C++17 im Falle von Vorlage Vorlage Parameter, Verwendung von class 代わりに typename erforderlich war. Siehe Antwort von user1428839 unten. (Aber in diesem speziellen Fall geht es nicht um eine Präferenz, sondern um eine sprachliche Vorgabe).

449voto

itsmatt Punkte 30839

Stan Lippman sprach über dieses Thema aquí . Ich fand es interessant.

Zusammenfassung : Stroustrup verwendete ursprünglich class zur Angabe von Typen in Vorlagen, um die Einführung eines neuen Schlüsselworts zu vermeiden. Einige Ausschussmitglieder befürchteten, dass diese Überladung des Schlüsselworts zu Verwirrung führen könnte. Später führte der Ausschuss ein neues Schlüsselwort ein typename um syntaktische Unklarheiten zu beseitigen, und beschlossen, sie auch zur Angabe von Vorlagentypen zuzulassen, um Verwirrung zu vermeiden, aber aus Gründen der Abwärtskompatibilität, class seine überladene Bedeutung behalten.

326voto

DarenW Punkte 16149

Laut Scott Myers, Effective C++ (3. Aufl.), Punkt 42 (was natürlich die endgültige Antwort sein muss), ist der Unterschied "nichts".

Es wird empfohlen, "class" zu verwenden, wenn zu erwarten ist, dass T immer eine Klasse sein wird, und "typename", wenn andere Typen (int, char*, was auch immer) erwartet werden können. Betrachten Sie dies als Verwendungshinweis.

160voto

JorenHeit Punkte 3557

Als Ergänzung zu den oben genannten Beiträgen ist die Verwendung des class Stichwort ist gezwungen (bis einschließlich C++14), wenn es um die Vorlage Vorlage Parameter, z.B.:

template <template <typename, typename> class Container, typename Type>
class MyContainer: public Container<Type, std::allocator<Type>>
{ /*...*/ };

In diesem Beispiel, typename Container hätte einen Compilerfehler erzeugt, etwa so:

error: expected 'class' before 'Container'

51voto

Michael Burr Punkte 320591

Ich ziehe es vor, typename zu verwenden, weil ich kein Fan von überladenen Schlüsselwörtern bin (Mensch - wie viele verschiedene Bedeutungen hat static für verschiedene Kontexte haben?).

18voto

user541686 Punkte 196656

Dort ist einen Unterschied, und Sie sollten die class a typename .

Aber warum?

typename ist für Vorlagenargumente unzulässig. Um konsistent zu sein, sollten Sie daher class :

template<template<class> typename MyTemplate, class Bar> class Foo { };    //  :(
template<template<class>    class MyTemplate, class Bar> class Foo { };    //  :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X