Є одне використання, яке вже не згадувалося в C ++, і це не посилатися на власний об'єкт або роз'єднувати член з отриманої змінної.
Ви можете використовувати this
для перетворення незалежного імені в ім'я, залежне від аргументу, всередині класів шаблонів, які успадковуються від інших шаблонів.
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
}
}
Шаблони складаються з двопрохідного механізму. Під час першого проходу вирішуються та перевіряються лише незалежні від аргументу імена, тоді як залежні імена перевіряються лише на узгодженість, фактично не замінюючи аргументів шаблону.
На цьому кроці, не фактично замінюючи тип, компілятор майже не має інформації про те, що base<T>
може бути (зауважте, що спеціалізація базового шаблону може перетворити його на абсолютно різні типи, навіть невизначені типи), тому він просто передбачає, що це тип . На цьому етапі незалежний виклик, f
який видається програмістом просто природним, є символом, який компілятор повинен знайти як член derived
або вкладених просторів імен - що не відбувається в прикладі - і він скаржиться.
Рішення - перетворення незалежного імені f
на залежне ім'я. Це можна зробити base<T>::f
двома способами, чітко вказавши тип, де він реалізований (- додавання base<T>
символу залежить від, T
і компілятор просто припустить, що він буде існувати, і відкладає фактичну перевірку другого проходу, після підміна аргументів.
Другий спосіб, значно сортуючи, якщо ви успадковуєте шаблони, у яких є більше одного аргументу або довгих імен, - це просто додавання this->
символу перед. Оскільки клас шаблонів, який ви реалізуєте, залежить від аргументу (він успадковується від base<T>
) this->
, залежить від аргументу, і ми отримуємо той же результат: this->f
перевіряється у другому раунді після заміни параметра шаблону.
this
в MSDN. Перейдіть за цим посиланням ... ;-)