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
ОБОВ'ЯЗКОВО використовувати ключове слово, як зазначено вище - воно в цьому випадку не взаємозамінне (зверніть увагу: оскільки C ++ 17 у цьому випадку дозволено обидва ключові слова) .typename
Ви також повинні використовувати class
при явній інстанції шаблону:
template class Foo<int>;
Я впевнений, що є й інші випадки, які я пропустив, але підсумок такий: ці два ключові слова не є еквівалентними, і це деякі поширені випадки, коли потрібно використовувати те чи інше.
template <typename T> typename Foo {};
, тому що Foo <T> це, безумовно, клас.