模板基类typedef成员不可见

template base class typedef members invisible

本文关键字:成员 typedef 基类      更新时间:2023-10-16

我知道"依赖名称"在默认情况下对编译器不可见。但在回答其他SO问题时(在这里,在这里,最终在C++问题中),我被告知using声明可能会有所帮助。

所以我试过了。

模板基类:

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

我在ideone上试过这个。具有gcc-4.3.3和gcc-4.5.1

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

您可能想要做:

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

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

语法using Base::member;只能用于将非类型成员的声明带入作用域。


另外请注意,这些都不是实际需要的,您可以限定每次使用(对于带基数的类型,对于带this->或基数的非类型),这将使符号依赖。