关于c ++:模板基类typedef成员不可见

template base class typedef members invisible

我知道编译器默认情况下"依赖名称"是不可见的。但是我被告知其他问题(这里,这里,最后是C++ FAQ),EDCOX1×0声明可能有帮助。

所以我试过了。

模板基类:

1
2
3
4
5
6
7
// regardless of the fact that members are exposed...
template<typename T>
struct TBase {
   typedef T MemberType;
   MemberType baseMember;
   MemberType baseFunction() { return MemberType(); }
};

和派生类,使用基的成员:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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。

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


你可能想这样做:

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

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

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

还要注意,实际上不需要这些,您可以限定每种使用(对于具有基的类型,对于具有this->或基的非类型),这将使符号依赖。