c++11 - 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 字段
谢谢
解决方案
正如@Darhuuk 所指出的,这是一个“派生类型”问题。但是 - 你不必使用this->
。以下也将起作用:
int foo() { return A<ENUM::Size>::arr[0]; }
因为它也将您置于派生名称查找上下文中。
事实上,即使您忘记了“派生名称查找”规则,如果查找失败,尝试使用“完整的、命名空间和类的、合格的名称”总是一个好主意。有助于解决命名空间的歧义、多重继承和普通感冒,或者我听说过:-)
推荐阅读
- ios - 当允许用户删除他们的帐户时,它只会删除他们的帐户身份验证,这还不够
- php - 访问最后插入 ID mysqli
- powershell - 无法执行 Docker exec *ID* -it 命令
- arrays - 解决这个完成块
- mongodb - 如何在数组中使用 mongoDB 中的 dateFromString
- python - Scrapy 导入错误:没有名为 Scrapy 的模块
- math - 在 Jupyter Notebook 中用 Markdown 编写的数学符号在 GitHub 上呈现不一致
- node.js - 在控制台中将 NodeJS / MongoDB 查询输出到 String Runnable
- gradle - 如何强制更改gradle中mudule的依赖关系
- react-native-android - react native run android不起作用,并且无法安装应用程序