typename
Сообщает компилятору, что неизвестный идентификатор представляет собой тип.
typename identifier;
Заметки
Используйте это ключевое слово только в определениях шаблонов.
Это ключевое слово является обязательным, если имя полное и зависит от аргумента шаблона; если полное имя независимо, данное ключевое слово необязательно. Дополнительные сведения см. в разделе Шаблоны и разрешение имен.
Ключевое слово typename может использоваться любым типом в любом месте объявления или определения шаблона. В списке базовых классов оно не допускается, если не применяется в качестве аргумента шаблона для базового класса шаблона.
template <class T>
class C1 : typename T::InnerType // Error - typename not allowed.
{};
template <class T>
class C2 : A<typename T::InnerType> // typename OK.
{};
Ключевое слово typename также можно использовать вместо ключевого слова class в списках параметров шаблона. Например, указанные ниже операторы идентичны.
template<class T1, class T2>...
template<typename T1, typename T2>...
Пример
// typename.cpp
template<class T> class X
{
typename T::Y m_y; // treat Y as a type
};
int main()
{
}