typename
Diz para o compilador que um identificador desconhecido é um tipo.
typename identifier;
Comentários
Use essa palavra-chave apenas em definições de modelo.
Essa palavra-chave deverá ser usada se o nome for dependente de um nome qualificado em um argumento de modelo; será opcional se o nome qualificado não for dependente. Para obter mais informações, consulte Resolução de modelos e nomes.
typename pode ser usado por qualquer tipo em qualquer lugar em uma declaração ou definição de modelo. Não é permitido na lista de classes base, a menos que como um argumento de modelo para uma classe base de modelo.
template <class T>
class C1 : typename T::InnerType // Error - typename not allowed.
{};
template <class T>
class C2 : A<typename T::InnerType> // typename OK.
{};
A palavra-chave typename também pode ser usada no lugar class em listas de parâmetros do modelo. Por exemplo, as seguintes instruções são idênticas:
template<class T1, class T2>...
template<typename T1, typename T2>...
Exemplo
// typename.cpp
template<class T> class X
{
typename T::Y m_y; // treat Y as a type
};
int main()
{
}