Il y a une utilisation qui n'a pas déjà été mentionnée en C ++ et qui n'est pas de faire référence au propre objet ou de lever l'ambiguïté d'un membre d'une variable reçue.
Vous pouvez utiliser this
pour convertir un nom non dépendant en un nom dépendant d'argument à l'intérieur de classes de modèles héritant d'autres modèles.
template <typename T>
struct base {
void f() {}
};
template <typename T>
struct derived : public base<T>
{
void test() {
//f(); // [1] error
base<T>::f(); // quite verbose if there is more than one argument, but valid
this->f(); // f is now an argument dependent symbol
}
}
Les modèles sont compilés avec un mécanisme à deux passes. Lors de la première passe, seuls les noms non dépendants des arguments sont résolus et vérifiés, tandis que les noms dépendants ne sont vérifiés que pour leur cohérence, sans réellement remplacer les arguments du modèle.
À cette étape, sans réellement remplacer le type, le compilateur n'a presque aucune information de ce qui base<T>
pourrait être (notez que la spécialisation du modèle de base peut le transformer en types complètement différents, même des types non définis), donc il suppose simplement qu'il s'agit d'un type . À ce stade, l'appel non dépendant f
qui semble naturel au programmeur est un symbole que le compilateur doit trouver en tant que membre derived
ou dans des espaces de noms fermés - ce qui ne se produit pas dans l'exemple - et il se plaindra.
La solution consiste à transformer le nom non dépendant f
en un nom dépendant. Cela peut être fait de deux manières, en indiquant explicitement le type où il est implémenté ( base<T>::f
- l'ajout de base<T>
rend le symbole dépendant T
et le compilateur supposera simplement qu'il existera et reporte la vérification réelle de la deuxième passe, après substitution d'argument.
La deuxième façon, beaucoup de trieur si vous héritez de modèles qui ont plus d'un argument, ou des noms longs, consiste simplement à ajouter un this->
avant le symbole. Comme la classe de modèle que vous implémentez dépend d'un argument (dont il hérite base<T>
) this->
dépend de l'argument, et nous obtenons le même résultat: this->f
est vérifié au deuxième tour, après la substitution des paramètres du modèle.
this
de MSDN. Veuillez suivre ce lien ... ;-)