typename
et class
sind im Grundfall der Angabe einer Vorlage austauschbar:
template<class T>
class Foo
{
};
y
template<typename T>
class Foo
{
};
gleichwertig sind.
Es gibt jedoch bestimmte Fälle, in denen ein Unterschied besteht zwischen typename
et class
.
Der erste Fall betrifft die abhängigen Typen. typename
wird verwendet, um zu deklarieren, wenn Sie auf einen verschachtelten Typ verweisen, der von einem anderen Vorlagenparameter abhängt, wie z. B. der typedef
in diesem Beispiel:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Das zweite zeigen Sie in Ihrer Frage, auch wenn Sie es vielleicht nicht merken:
template < template < typename, typename > class Container, typename Type >
Bei der Angabe einer Vorlage Vorlage die class
Schlüsselwort MUSS wie oben verwendet werden - es ist no austauschbar mit typename
in diesem Fall (Hinweis: seit C++17 sind in diesem Fall beide Schlüsselwörter erlaubt) .
Sie müssen auch Folgendes verwenden class
bei der expliziten Instanziierung einer Vorlage:
template class Foo<int>;
Ich bin sicher, dass es noch andere Fälle gibt, die ich übersehen habe, aber die Quintessenz ist: Diese beiden Schlüsselwörter sind nicht gleichwertig, und dies sind einige häufige Fälle, in denen Sie das eine oder das andere verwenden müssen.