11
我意识到“依赖名称”对编译器默认情况下不可见。但我被告知回答其他SO问题(here,here,最终on the C++ faq)using
声明可能有所帮助。模板基类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'的'依赖名'定律?
卡住了这个问题。遇到你的答案,并在派生类中使用“this->”的工作就像一个魅力。谢谢。 –
实际上,您可以使用语法,但需要typename'使用typename TBase :: MemberType;'似乎适用于我 –
RiaD