typenameund classsind 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 typenameund gibt class.
Der erste ist bei abhängigen Typen. typenamewird verwendet, um zu deklarieren, wenn Sie auf einen verschachtelten Typ verweisen, der von einem anderen Vorlagenparameter abhängt, wie typedefin 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, classwenn 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.