首页 > 解决方案 > c++ - 使用枚举作为模板类型,不能从继承类中访问父类字段

问题描述

考虑以下代码

#include <iostream>

template <size_t N>
struct A {
  int arr[N];
};


template <typename ENUM> 
struct B : public A<ENUM::Size> {
  int foo() { return sizeof(*this); }
};

struct E {
  enum E_ {a, b, c, Size};
};

int main() {
  B<E> b;
  std::cerr << b.foo() << "\n";
}

到目前为止,一切都编译得很好,并打印了 12。但是当我更改 foo 实现时:

int foo() { return arr[0]; } // should inherit arr from parent class A

我收到编译错误:

error: `arr` was not declared in this scope
   int foo() { return i; }

我错过了什么?我可以让它工作吗?

(显然,当我将 B 定义更改为愚蠢的东西时:

struct B : public A<17> {
  int foo() { return arr[2]; }
};

一切都编译得很好)

更令我惊讶的是,如果我将这一行添加到main()

b.arr[0] = 3;

一切仍然编译得很好,所以我似乎无法从 B 中访问 A 字段

谢谢

标签: c++11

解决方案


正如@Darhuuk 所指出的,这是一个“派生类型”问题。但是 - 你不必使用this->。以下也将起作用

int foo() { return A<ENUM::Size>::arr[0]; }

因为它也将您置于派生名称查找上下文中。

事实上,即使您忘记了“派生名称查找”规则,如果查找失败,尝试使用“完整的、命名空间和类的、合格的名称”总是一个好主意。有助于解决命名空间的歧义、多重继承和普通感冒,或者我听说过:-)


推荐阅读