这是代码:

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不是模板,则一切正常。为何如此?如何在模板中修复?

最佳答案

InnerBase不是独立类型,而是实际上是一个依赖类,因为它实际上是Outer<T>::InnerBase。因此InnerChild不知道它确切是从谁继承的(想想专门化*!),因此它不知道n实际上是一个名称。

要断言n确实是类成员的名称,请说this->nInnerBase::n,或在using InnerBase::n;中的某个位置添加一个声明InnerChild

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

10-06 16:18