
Matte
Für Vorlagen habe ich beide Deklarationen gesehen:
template < typename T >
template < class T >
Was ist der Unterschied?
Und was genau bedeuten diese Schlüsselwörter im folgenden Beispiel (entnommen aus dem deutschen Wikipedia-Artikel über Vorlagen)?
template < template < typename, typename > class Container, typename Type >
class Example
{
Container< Type, std::allocator < Type > > baz;
};

Aaron Klotz
typename
und class
sind im Grundfall der Angabe einer Vorlage austauschbar:
template<class T>
class Foo
{
};
und
template<typename T>
class Foo
{
};
sind gleichwertig.
Allerdings gibt es bestimmte Fälle, in denen ein Unterschied besteht typename
und class
.
Der erste betrifft abhängige Typen. typename
wird verwendet, um zu deklarieren, wenn Sie auf einen verschachtelten Typ verweisen, der von einem anderen Vorlagenparameter abhängt, z typedef
in diesem Beispiel:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Die zweite, die Sie tatsächlich in Ihrer Frage zeigen, obwohl Sie es vielleicht nicht erkennen:
template < template < typename, typename > class Container, typename Type >
Bei Angabe von a Vorlage Vorlageder class
Schlüsselwort MUSS wie oben verwendet werden – es ist nicht austauschbar mit typename
in diesem Fall (Hinweis: seit C++17 sind in diesem Fall beide Schlüsselwörter erlaubt).
Sie müssen auch verwenden class
beim expliziten Instanziieren einer Vorlage:
template class Foo<int>;
Ich bin mir sicher, dass es andere Fälle gibt, die ich übersehen habe, aber das Fazit ist: Diese beiden Schlüsselwörter sind nicht gleichwertig, und dies sind einige häufige Fälle, in denen Sie das eine oder andere verwenden müssen.

Georg Fritzsche
Zum Benennen von Vorlagenparametern typename
und class
sind gleichwertig. §14.1.2:
Es gibt keinen semantischen Unterschied zwischen class und typename in einem Template-Parameter.
typename
Es ist jedoch in einem anderen Kontext möglich, wenn Vorlagen verwendet werden – um dem Compiler anzuzeigen, dass Sie sich auf einen abhängigen Typ beziehen. §14.6.2:
Es wird davon ausgegangen, dass ein Name, der in einer Vorlagendeklaration oder -definition verwendet wird und von einem Vorlagenparameter abhängig ist, keinen Typ benennt, es sei denn, die anwendbare Namenssuche findet einen Typnamen oder der Name ist durch das Schlüsselwort typename qualifiziert.
Beispiel:
typename some_template<T>::some_type
Ohne typename
Der Compiler kann im Allgemeinen nicht erkennen, ob Sie sich auf einen Typ beziehen oder nicht.
Obwohl es keinen technischen Unterschied gibt, habe ich gesehen, dass die beiden verwendet werden, um leicht unterschiedliche Dinge zu bezeichnen.
Für eine Vorlage, die jeden Typ als T akzeptieren sollte, einschließlich eingebauter Elemente (z. B. ein Array )
template<typename T>
class Foo { ... }
Für eine Vorlage, die nur funktioniert, wenn T eine echte Klasse ist.
template<class T>
class Foo { ... }
Aber denken Sie daran, dass dies nur eine Stilsache ist, die manche Leute verwenden. Nicht vom Standard vorgeschrieben oder von Compilern erzwungen
- Kein Unterschied
- Vorlagentypparameter
Container
ist selbst eine Vorlage mit zwei Typparametern.
Dieses Stück Snippet stammt aus dem C++ Primer Book. Obwohl ich sicher bin, dass das falsch ist.
Jedem Typparameter muss das Schlüsselwort class oder typename vorangestellt werden:
// error: must precede U with either typename or class
template <typename T, U> T calc(const T&, const U&);
Diese Schlüsselwörter haben dieselbe Bedeutung und können in einer Vorlagenparameterliste austauschbar verwendet werden. Eine Vorlagenparameterliste kann beide Schlüsselwörter verwenden:
// ok: no distinction between typename and class in a template parameter list
template <typename T, class U> calc (const T&, const U&);
Es mag intuitiver erscheinen, das Schlüsselwort typename anstelle von class zu verwenden, um einen Vorlagentypparameter zu bezeichnen. Schließlich können wir eingebaute (Nicht-Klassen-) Typen als Template-Typ-Argument verwenden. Darüber hinaus gibt typename deutlicher an, dass der folgende Name ein Typname ist. Typname wurde jedoch zu C++ hinzugefügt, nachdem Templates bereits weit verbreitet waren; Einige Programmierer verwenden weiterhin ausschließlich Klassen

Benutzer438383
Es gibt keinen Unterschied zwischen der Verwendung <typename T>
ODER <class T>
; dh es ist eine Konvention, die von C++-Programmierern verwendet wird. Ich selbst bevorzuge <typename T>
da es seine Verwendung klarer beschreibt; dh eine Vorlage mit einem bestimmten Typ definieren.
Hinweis: Es gibt eine Ausnahme, bei der Sie verwenden müssen class
(und nicht typename
) beim Deklarieren eines Template-Template-Parameters:
template <template <typename> class T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!
In den meisten Fällen werden Sie keine verschachtelte Vorlagendefinition definieren, sodass beide Definitionen funktionieren werden – seien Sie einfach konsistent in Ihrer Verwendung.
9895100cookie-checkUnterschied der Schlüsselwörter ‘typename’ und ‘class’ in Templates?yes