Le mot-clé typename en C++
- Noms qualifiés et non qualifiés en C++
- Noms dépendants et non dépendants en C++
-
Utilisation du 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
.