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> определенно является классом.