Ada satu penggunaan yang belum disebutkan dalam C ++, dan itu bukan untuk merujuk ke objek sendiri atau mendisambiguasikan anggota dari variabel yang diterima.
Anda bisa menggunakan this
untuk mengonversi nama yang tidak tergantung menjadi nama yang bergantung argumen di dalam kelas templat yang mewarisi dari templat lain.
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
}
}
Template dikompilasi dengan mekanisme dua pass. Selama pass pertama, hanya nama-nama non-argumen yang dependen yang diselesaikan dan diperiksa, sementara nama-nama dependen hanya diperiksa untuk koherensi, tanpa benar-benar menggantikan argumen templat.
Pada langkah itu, tanpa benar-benar mengganti tipe, kompiler hampir tidak memiliki informasi tentang apa yang base<T>
bisa (perhatikan bahwa spesialisasi template dasar dapat mengubahnya menjadi tipe yang sama sekali berbeda, bahkan tipe yang tidak terdefinisi), jadi ia hanya berasumsi bahwa itu adalah tipe . Pada tahap ini panggilan non-dependen f
yang tampaknya wajar bagi programmer adalah simbol yang harus ditemukan oleh kompiler sebagai anggota derived
atau dalam melampirkan ruang nama - yang tidak terjadi dalam contoh - dan itu akan mengeluh.
Solusinya adalah mengubah nama yang tidak tergantung f
menjadi nama yang tergantung. Hal ini dapat dilakukan dalam beberapa cara, dengan secara eksplisit menyatakan jenis di mana ia diterapkan (- base<T>::f
menambahkan base<T>
simbol membuat ketergantungan T
dan kompilator hanya akan menganggap bahwa itu akan ada dan menunda pemeriksaan aktual untuk lintasan kedua, setelah substitusi argumen.
Cara kedua, jauh lebih penyortir jika Anda mewarisi dari template yang memiliki lebih dari satu argumen, atau nama panjang, hanya menambahkan this->
sebelum simbol. Sebagai kelas templat yang Anda laksanakan tergantung pada argumen (diturunkan dari base<T>
) this->
adalah bergantung pada argumen, dan kami mendapatkan hasil yang sama: this->f
dicentang di babak kedua, setelah penggantian parameter templat.
this
MSDN. Silakan ikuti tautan ini ... ;-)