'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:
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. –
aslında, sen sözdizimi kullanarak kullanabilirsiniz ama typename TBen kullanarak yazmanız gerekir '' t :: MemberType; '' çalışmak benim için çalışıyor –
RiaD