typename
e class
sono intercambiabili nel caso di base per specificare un modello:
template<class T>
class Foo
{
};
e
template<typename T>
class Foo
{
};
sono equivalenti.
Detto questo, ci sono casi specifici in cui esiste una differenza tra typename
eclass
.
Il primo è nel caso di tipi dipendenti. typename
viene utilizzato per dichiarare quando si fa riferimento a un tipo nidificato che dipende da un altro parametro del modello, come ad esempio typedef
in questo esempio:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Il secondo che mostri effettivamente nella tua domanda, anche se potresti non rendertene conto:
template < template < typename, typename > class Container, typename Type >
Quando si specifica un modello di modello , la class
parola chiave DEVE essere utilizzata come sopra - in questo caso non è intercambiabile (nota: poichétypename
in questo caso C ++ 17 sono consentite entrambe le parole chiave) .
È inoltre necessario utilizzare class
quando si crea un'istanza esplicita di un modello:
template class Foo<int>;
Sono sicuro che ci sono altri casi che mi sono perso, ma la linea di fondo è: queste due parole chiave non sono equivalenti e questi sono alcuni casi comuni in cui è necessario utilizzare l'uno o l'altro.
template <typename T> typename Foo {};
, perché Foo <T> è sicuramente una classe.