2011-02-09 25 views
68

Anlamadım, bana f numaralı çağrı tamamen belirsiz görünüyor, ancak expected primary-expression before ‘int’ ile derlenemiyor. Satırı f numaralı çağrıyla açıklarsam, iyi derler.Neden açık bir parametre ile şablon üye işlevini çağırmaya çalışırken bir hata alıyorum?

template<typename T> 
struct A { 
    template<typename S> 
    void f() { } 
}; 

template<typename T> 
struct B : A<T> { 
    void g() { 
     this->f<int>(); 
    } 
}; 
+29

Sadece bu kutsal olmayan problemi bulmakla kalmayıp, bir zamanlar tarif ederken asla küfür etmediğiniz için sizi alkışlıyorum. –

cevap

129

Bu size hangi tip bir şablon argüman bağlıdır bir nesne bir şablon işlevi erişmeye çalıştığında bir şablon varsa, template anahtar kelimeyi kullanmak zorunda olduğu standardın gerçekten karanlık hüküm nedeniyle garip bir şekilde:

this->template f<int>(); 

Bu fonksiyonların uygulandığı durumlar haricinde, bağlı türleri ile çıkageldi typename ile garabeti benzer. Eğer template anahtar kelimeyi bırakırsanız Özellikle,

this->f<int>() 
(ne amaçladığınız)

ve hiçbir anlamı (dolayısıyla da hatası) yapar

((this->f) < int) >() 

arasında bir ayrıştırma belirsizlik var. template anahtar kelimesinin kullanımı, diski belirsiz kılar ve derleyiciyi, bozuk semboller kümesinden ziyade şablonlu bir işleve tam olarak geçerli bir çağrıya baktığını anlamaya zorlar.

Bu yardımcı olur umarız!

+2

Şablonlarla ilgili birkaç sözdizimsiz tuhaflığı zaten biliyordum, ama bunu daha önce hiç duymamıştım. – Gorpik

+0

@Gorpik: bu yüzden böyle şeylerden kaçınmalısınız :) – akira

+1

@templatetypedef: Herhangi bir derleyicinin bunu doğru bir şekilde teşhis edip etmediğini biliyor musunuz? CLang'ın (dostça bir tanı olduğunu iddia eden) 'şablon' fikrinin bir ipucu olarak eklenmesini tavsiye edip edemeyeceğini görmek isterim, maalesef elimde bu işe yaramaz. –

İlgili konular