c – 模板基类typedef成员不可见

我知道默认情况下,“依赖名称”对编译器不可见.但是我被告知在其他SO问题(here,here,最终on the C++ faq)的答案中,使用声明可能有所帮助.

所以我试过

模板基类:

// 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

这是预期的行为吗?我们应该如何使用“依赖名称”法来访问父模板类的成员typedef?

最佳答案
你可能想做:

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

要么

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

使用Base :: member的语法只能将非类型成员的声明带入范围.

还要注意,这些都不是实际需要的,您可以限定每个使用(对于具有基础的类型,对于具有这个 – >或base的非类型),并且将使符号依赖.

转载注明原文:c – 模板基类typedef成员不可见 - 代码日志