模板类中派生类中的成员不可访问

Unreachable member in derived class in template class

本文关键字:访问 成员 派生      更新时间:2023-10-16

以下是代码:

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,或者在InnerChild中的某个点添加声明using InnerBase::n;

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