2011-03-13 36 views
16

Aşağıdaki gibi GetContainer() işlevim var.g ++ template parametre hatası

template<typename I,typename T,typename Container> 
Container& ObjCollection<I,T,Container>::GetContainer() 
{ 
    return mContainer; 
} 

I hatalarından var

template<typename I,typename T> 
T& DynamicObjCollection<I,T>::Insert(T& t) 
{ 
    GetContainer().insert(&t); 
    return t; 
} 

şöyle ben bu yöntemi kullanın.

error: there are no arguments to ‘GetContainer’ that depend on a template parameter, 
so a declaration of ‘GetContainer’ must be available 

error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of 
an undeclared name is deprecated) 

MSVC ile sorunsuz çalışıyor, ancak g ++ buna izin vermiyor. Kodun nesi var?

+0

Sorunu gösteren eksiksiz, tamamlanabilir bir örnek gönderir misiniz? –

cevap

53

işlevinin ObjCollection yöntemidir, Insert ise DynamicObjectCollection üyesidir. Bundan'un ObjectCollection'dan miras olduğunu farz edelim.

Eğer durum böyleyse, sorun, bir şablon taban sınıfından miras alan bir şablon sınıfını yazdığınızda, ad arama çalışmasının şekli normal sınıflardaki ad aramalarından biraz farklıdır. Özellikle, temel sınıf üyelerini isimlerini kullanarak referans gösteremezsiniz; Derleyiciye isminin nereye bakılacağını belirtmeniz gerekir. Bunun Visual Studio'da çalışmasının nedeni, Microsoft C++ derleyicisinin aslında bu davranışı yanlış algılaması ve teknik olarak gayretli bir şekilde derlenmesini sağlayan kodlara izin vermesidir.

Temel sınıfın GetContainer işlevini çağırmak isterseniz, iki seçeneğiniz vardır. İlk olarak, çağrı üye işlevine olduğuna işaret açıkça edebilirsiniz:

this->GetContainer().insert(&t); 

Şimdi derleyici GetContainer buna taban sınıfta GetContainer bakmak gerekebilir bilir, DynamicObjectCollection üyesi olduğunu bilir, ve böylece şablon başlatılıncaya kadar isim aramayı erteler.

template <typename I, typename T> 
class DynamicObjectCollection: public ObjectCollection<I, T, /* ? */> { 
public: 
    using ObjectCollection<I, T, /* ? */>::GetContainer; 

    /* ... */ 
}; 

Bu aynı zamanda GetContainer temel sınıf tanımlanabilir derleyici açıkça gösterir ve bu nedenle kadar arama atıfta bulunmaktadır mevcut

Diğer seçenek sınıfı vücuda using bildirimi eklemek olacaktır şablon örneği.

Bu durum sizin durumunuza uygun değilse, bildirin ve bu gönderiyi silebilirim.

Bu yardımcı olur umarız!

+5

+1 Teşekkürler! Şuan çalışıyor. – Erik

+1

Hızlı yazarak – prosseek