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 thispour 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 fqui semble naturel au programmeur est un symbole que le compilateur doit trouver en tant que membre derivedou 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 fen 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 Tet 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->fest vérifié au deuxième tour, après la substitution des paramètres du modèle.
thisde MSDN. Veuillez suivre ce lien ... ;-)