[C++] Unterschied der Schlüsselwörter 'Typname' und 'Klasse' in Templates?


Answers

Für die Benennung von Vorlagenparametern sind typename und class gleichwertig. §14.1.2:

Es gibt keinen semantischen Unterschied zwischen Klasse und Typname in einem Template-Parameter.

typename ist jedoch in einem anderen Kontext bei der Verwendung von Templates möglich - um auf den Compiler zu verweisen, den Sie auf einen abhängigen Typ beziehen. § 14.6.2:

Ein Name, der in einer Schablonendeklaration oder -definition verwendet wird und von einem Vorlagenparameter abhängig ist, wird davon ausgegangen, dass er keinen Typ angibt, es sei denn, die anwendbare Namensüberprüfung findet einen Typnamen oder der Name wird durch das Schlüsselwort typename qualifiziert.

Beispiel:

typename some_template<T>::some_type

Ohne typename der Compiler generell nicht sagen, ob Sie auf einen Typ verweisen oder nicht.

Question

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 (aus dem deutschen Wikipedia-Artikel über Templates)?

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



  1. Kein Unterschied
  2. Der Template-Typ-Parameter Container ist selbst eine Vorlage mit zwei Typparametern.