Le mot-clé typename en C++

Suraj P 12 octobre 2023
  1. Noms qualifiés et non qualifiés en C++
  2. Noms dépendants et non dépendants en C++
  3. Utilisation du mot-clé typename en C++
Le mot-clé typename en C++

Cet article traitera du mot-clé typename en C++.

Pour comprendre la signification du mot-clé typename, nous devons comprendre les concepts clés des noms qualifiés et dépendants.

Noms qualifiés et non qualifiés en C++

Un nom qualifié spécifie une portée. Voyons un exemple pour mieux comprendre.

#include <bits/stdc++.h>

int main() { std::cout << "Hello world!" << std::endl; }

Les références à cout et endl sont ici des noms qualifiés. Mais si nous les introduisons tous les deux dans la portée avec une déclaration using, c’est-à-dire using namespace std et juste utilisé cout par lui-même, ils deviendraient des noms non qualifiés parce qu’ils n’ont pas le std::.

Noms dépendants et non dépendants en C++

Les noms dépendants sont les noms qui dépendent d’un paramètre template.

Regardons un exemple de code pour mieux le comprendre.

template <class T>
class MyClass {
  int i;
  vector<int> vi;
  vector<int>::iterator vitr;

  T t;
  vector<T> vt;
  vector<T>::iterator viter;
}

Les trois premières déclarations sont appelées noms non dépendants car leur type est connu au moment de la déclaration du modèle.

Alors que si l’on regarde le deuxième ensemble de déclarations, T, vector<T>, et vector<T>::iterator sont des noms dépendants parce que leur type n’est pas connu jusqu’au moment de l’instanciation car ils dépendent du paramètre de template T.

Utilisation du mot-clé typename en C++

En règle générale, le mot-clé typename doit obligatoirement être utilisé avant un nom qualifié ou dépendant faisant référence à un type.

Ainsi, le mot-clé typename est introduit pour spécifier que l’identifiant qui suit est un type plutôt qu’une variable membre statique.

class A {
 public:
  typedef int myPtr;
};

template <class T>
class myClass {
 public:
  typename T::SubType* myPtr;
}

Dans le code ci-dessus, le mot-clé typename indique au compilateur que SubType est un type de la classe T, ce qui signifie que le pointeur myptr est un type de T::SubType.

Sans le mot-clé typename, SubType sera considéré comme un membre statique, et le compilateur l’évaluera comme une multiplication de SubType de type T avec le pointeur myptr.

T::SubType * myptr //compiler will think it's multiplication

Si nous n’utilisons pas le mot-clé typename dans le code ci-dessus, cela conduira à une erreur de compilation car le compilateur ne sait pas si T::SubType fera référence à un nom de type ou à un membre statique de T.

Auteur: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub