2012-11-15 23 views
11

'Bağımlı adların' varsayılan olarak derleyici tarafından görülmediğinin farkındayım. Ancak diğer SO sorularına (here, here ve nihayetinde on the C++ faq) yanıtlar verildiğinde bir using bildiriminin yardımcı olabileceği söylendi.template temel sınıf typedef üyeleri görünmez

Denedim. Üssün üyelerini kullanarak

// regardless of the fact that members are exposed... 
template<typename T> 
struct TBase { 
    typedef T MemberType; 
    MemberType baseMember; 
    MemberType baseFunction() { return MemberType(); } 
}; 

Ve Türetilmiş sınıf,:

bir şablon taban sınıfı

template<typename T> 
struct TDerived : public TBase<T> { 
    // http://www.parashift.com/c++-faq-lite/nondependent-name-lookup-members.html 
    // tells us to use a `using` declaration. 
    using typename TBase<T>::MemberType; 
    using TBase<T>::baseFunction; 
    using TBase<T>::baseMember; 

    void useBaseFunction() { 
     // this goes allright. 
     baseFunction(); 
     ++baseMember; 

     // but here, the compiler doesn't want to help... 
     MemberType t; //error: expected `;' before ‘t’ 
    } 
}; 

Ben this out on ideone çalıştı. Gcc-4.3.3 ve gcc-4.5.1 var.

Bu beklenen davranış? Ana şablon sınıfına 'üye typedefs' erişim için 'bağımlı isim' yasası etrafında nasıl çalışmalıyız?

using MemberType = typename TBase<T>::MemberType; // new type alias syntax 

veya

typedef typename TBase<T>::MemberType MemberType; // old type alias syntax 

sözdizimi using Base::member; sadece kapsam içine olmayan tip üyelerinin bildirimleri getirmek için kullanılabilir:

cevap

18

Muhtemelen yapmak istiyorum.


Ayrıca bunların hiçbiri gerçekte gerekli olduğunu, siz (this-> veya bazı ile sigara tipleri için, baz ile tipleri için) her kullanım kapsamına edebilir ve bu sembol bağımlı hale getirecek not edin.

+0

Bu sorunla karşılaşıldı. Cevabınızın karşısına çıkıp türetilmiş sınıftaki "this->" i kullanarak cazibe gibi çalıştı. Teşekkürler. –

+0

aslında, sen sözdizimi kullanarak kullanabilirsiniz ama typename TBen kullanarak yazmanız gerekir '' t :: MemberType; '' çalışmak benim için çalışıyor – RiaD

İlgili konular