C ++ 'da daha önce bahsedilmemiş bir kullanım vardır ve bu, kendi nesnesine atıfta bulunmak veya alınan bir değişkenden bir üyeyi belirsizleştirmek değildir.
this
Bağımlı olmayan bir adı, diğer şablonlardan devralan şablon sınıflarının içindeki bağımsız değişken bağımlı bir ada dönüştürmek için kullanabilirsiniz .
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
}
}
Şablonlar iki geçişli bir mekanizma ile derlenir. İlk geçiş sırasında, yalnızca bağımsız değişkene bağımlı olmayan adlar çözümlenir ve denetlenirken, bağımlı adlar, şablon bağımsız değişkenlerini gerçekten değiştirmeden yalnızca tutarlılık açısından denetlenir.
Bu adımda, türü gerçekten değiştirmeden, derleyicinin ne base<T>
olabileceğine dair neredeyse hiçbir bilgisi yoktur (temel şablonun uzmanlaşmasının, onu tamamen farklı türlere, tanımsız türlere dönüştürebileceğini unutmayın), bu yüzden bunun yalnızca bir tür olduğunu varsayar. . Bu aşamada, f
programcı için doğal görünen bağımlı olmayan çağrı , derleyicinin, derived
örnekte bulunmayan ad alanlarının bir üyesi veya kapalı olarak bulması gereken bir simgedir ve şikayet edecektir.
Çözüm, bağımlı olmayan adı bağımlı bir ada f
dönüştürmektir. Bu açıkça uygulandığı türü (belirterek, birkaç yönden yapılabilir base<T>::f
--adding base<T>
üzerinde sembol bağımlı kılan T
ve derleyici sadece mevcut ve olacağı üstlenecek erteledi sonra ikinci geçiş için fiili kontrolü, argüman ikamesi.
İkinci yol, birden fazla argümanı veya uzun adı olan şablonlardan miras alırsanız çok daha sıralayıcı this->
, sembolün önüne bir ekleme yapmaktır. Uyguladığınız şablon sınıfı bir bağımsız değişkene bağlı olduğundan (miras devralı olduğu base<T>
) this->
bağımsız değişkene bağımlıdır ve aynı sonucu alırız: this->f
şablon parametresi değiştirildikten sonra ikinci turda kontrol edilir.
this
. Lütfen bu bağlantıyı takip edin ... ;-)