模板类中派生类中的无法访问的成员

时间:2012-07-21 23:26:29

标签: c++ templates

以下是代码:

template <typename T>
struct Outer {
  struct InnerBase {
    int n;
    InnerBase() : n(42) { }
  };
  struct InnerChild : InnerBase {
    int getN() { return n; }
  };
};

问题在于:

In member function 'int Outer<T>::InnerChild::getN()':
error: 'n' was not declared in this scope

如果Outer不是模板,一切正常。怎么会这样?如何在模板中修复它?

1 个答案:

答案 0 :(得分:7)

InnerBase不是一个独立的类型,但实际上是一个依赖类,因为它确实是Outer<T>::InnerBase。因此InnerChild不知道它究竟是从哪个继承(想想特化*!),因此它不知道n实际上是一个名字。

断言n确实是班级成员的名字,比如this->nInnerBase::n,或者在using InnerBase::n;的某个位置添加声明InnerChild }。

*)例如template <> struct Outer<int>::InnerBase { typedef int n; };