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 spezielle Fälle, in denen es einen Unterschied zwischen typename
und gibt class
.
Der erste ist bei abhängigen Typen. typename
wird verwendet, um zu deklarieren, wenn Sie auf einen verschachtelten Typ verweisen, der von einem anderen Vorlagenparameter abhängt, wie typedef
in diesem Beispiel:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Der zweite, den Sie tatsächlich in Ihrer Frage zeigen, obwohl Sie ihn möglicherweise nicht erkennen:
template < template < typename, typename > class Container, typename Type >
Bei der Angabe einer Vorlagenvorlageclass
MUSS das Schlüsselwort wie oben verwendet werden - es ist in diesem Fall nicht austauschbar (Hinweis: In C ++ 17 sind in diesem Fall beide Schlüsselwörter zulässig) .typename
Sie müssen auch Folgendes verwenden, class
wenn Sie eine Vorlage explizit instanziieren:
template class Foo<int>;
Ich bin mir sicher, dass es andere Fälle gibt, die ich verpasst habe, aber das Fazit lautet: 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.
template <typename T> typename Foo {};
, da Foo <T> definitiv eine Klasse ist.