2012-11-15 60 views
11

我意识到“依赖名称”对编译器默认情况下不可见。但我被告知回答其他SO问题(here,here,最终on the C++ faqusing声明可能有所帮助。模板基类typedef成员不可见

所以我试了。

模板基类:

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

而且派生类中,使用基本的成员:

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’ 
    } 
}; 

我试过this out on ideone。它有gcc-4.3.3和gcc-4.5.1

这是预期的行为吗?我们应该如何解决访问父模板类'成员typedefs'的'依赖名'定律?

回答

18

你可能想要做的:

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

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

语法using Base::member;只能用于将非类型成员的声明为范围。


另外请注意,这些都不是实际需要,可以限定每个使用(类型与基础,对于非类型有两种this->或基地),这将使得符号依赖。

+0

卡住了这个问题。遇到你的答案,并在派生类中使用“this->”的工作就像一个魅力。谢谢。 –

+0

实际上,您可以使用语法,但需要typename'使用typename TBase :: MemberType;'似乎适用于我 – RiaD