typenameи classвзаимозаменяемы в основном случае указания шаблона:
template<class T>
class Foo
{
};
а также
template<typename T>
class Foo
{
};
эквивалентны.
Сказав это, есть конкретные случаи, когда есть разница между typenameиclass .
Первый - в случае зависимых типов. typenameиспользуется для объявления, когда вы ссылаетесь на вложенный тип, который зависит от другого параметра шаблона, такого как typedefв этом примере:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
Второе, которое вы на самом деле показываете в своем вопросе, хотя можете не осознавать этого:
template < template < typename, typename > class Container, typename Type >
При указании шаблона шаблона , то classключевое слово должно использоваться , как описано выше , - это не взаимозаменяемы typenameв этом случае (примечание: так как C ++ 17 как ключевые слова разрешены в данном случае) .
Вы также должны использовать classпри явном создании шаблона:
template class Foo<int>;
Я уверен, что есть другие случаи, которые я пропустил, но суть в том, что эти два ключевых слова не эквивалентны, и это некоторые распространенные случаи, когда вам нужно использовать одно или другое.
template <typename T> typename Foo {};, потому что Foo <T> определенно является классом.