2010-04-29 8 views
6

bu örnekte olduğu gibi, bir türetilmiş sınıftaki bir şablonu temel sınıf üyesi değişkeni kullanmak çalışıyorum:kullanma elemanı değişkenler

template <class dtype> 
struct A { 
    int x; 
}; 

template <class dtype> 
struct B : public A<dtype> { 
    void test() { 
     int id1 = this->x;  // always works 
     int id2 = A<dtype>::x; // always works 
     int id3 = B::x;   // always works 
     int id4 = x;   // fails in gcc & clang, works in icc and xlc 
    } 
}; 

gcc ve çınlama hem de Bu değişkeni kullanmayla ilgili çok seçici ve açık bir kapsam veya "bu" açık kullanımını gerektirir. Bazı diğer derleyicilerle (xlc ve icc), işler beklediğim gibi çalışır. Bu standart değil kod veya gcc ve clang bir hata izin xlc ve icc bir durumdur?

+1

Benzer soru: http://stackoverflow.com/questions/11405/gcc-problem-using-a-member-of-a-base-class-that-depends-on-a-template-argument –

cevap

5

Büyük ihtimalle sıkı olmayan modda icc'de derliyorsunuzdur. Her neyse, x'dan beri niteliksiz olduğundan, şablon parametrelerine bağlı olan herhangi bir temel sınıfta araştırılmamalıdır. Kodunuzda, x'un bulunduğu bir yer yok ve kodunuz geçersiz.

Diğer adlar başka bir arama biçimi (sınıf üyesi erişim araması ve nitelikli arama) kullanılarak incelenir. Bu formların her ikisi de, eğer bağımlılarsa, (eğer bağımlılarsa ve bu yüzden dtype bilindiğinde şablonu başlatırken yukarı bakarlarsa) bağımlı temel sınıflara bakarlar - diğer tüm isimler şablon parametrelerine bağlıdır).

GCC, en son sürümlerinde bile, düzgün olmayan arama sırasında doğru şekilde ve bazı bağımlı isimler still resolve against dependent bases uygulamıyor.