794 Stimmen

Unterschied zwischen den Schlüsselwörtern 'typename' und 'class' in Vorlagen?

Für Vorlagen habe ich beide Erklärungen gesehen:

template < typename T >
template < class T >

Was ist der Unterschied?

Und was genau bedeuten diese Schlüsselwörter in dem folgenden Beispiel (aus dem deutschen Wikipedia-Artikel über Vorlagen)?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};

7voto

K.K Punkte 303

Dieses Snippet stammt aus dem C++ Primer-Buch. Obwohl ich sicher bin, dass dies 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 die gleiche Bedeutung und können innerhalb einer Vorlagenparameterliste austauschbar verwendet werden. In einer Template-Parameterliste können beide Schlüsselwörter verwendet werden:

// 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 Schablonentyp-Parameter zu bezeichnen. Schließlich können wir auch eingebaute (klassenfremde) Typen als Argument für einen Vorlagentyp verwenden. Außerdem zeigt typename deutlicher an, dass der nachfolgende Name ein Typname ist. Allerdings wurde typename zu C++ hinzugefügt, nachdem Vorlagen bereits weit verbreitet waren; einige Programmierer verwenden weiterhin ausschließlich class

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