12.6. Mot-clé typename

Nous avons déjà vu que le mot clé typename pouvait être utilisé pour introduire les types génériques dans les déclarations template. Cependant, il peut être utilisé dans un autre contexte pour introduire les identificateurs de types inconnus dans les template. En effet, un type générique peut très bien être une classe définie par l'utilisateur, à l'intérieur de laquelle des types sont définis. Afin de pouvoir utiliser ces types dans les définitions des template, il est nécessaire d'utiliser le mot clé typename pour les introduire, car a priori le compilateur ne sait pas que le type générique contient la définition d'un autre type. Ce mot clé doit être placé avant le nom complet du type :

typename identificateur

Le mot clé typename est donc utilisé pour signaler au compilateur que l'identificateur identificateur est un type.

Exemple 12-15. Mot-clé typename

class A
{
public:
    typedef int Y;    // Y est un type défini dans la classe A.
};

template <class T>
class X
{
    typename T::Y i;  // La classe template X suppose que le
                      // type générique T définisse un type Y.
};

X<A> x;              // A peut servir à instancier une classe
                      // à partir de la classe template X.