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>;
Я уверен, что есть другие случаи, которые я пропустил, но суть в следующем: эти два ключевых слова не эквивалентны, и это некоторые распространенные случаи, когда вам нужно использовать одно или другое.