c++ - 从模板类继承:“成员”未在此范围内声明
问题描述
template<typename T> class A {
protected:
int member;
};
template<typename T> class B : public A<T> {
B() {
member = 12;
}
};
当我尝试编译上述程序时,我得到:
test.cpp: In constructor ‘B<T>::B()’:
test.cpp:8:9: error: ‘member’ was not declared in this scope
member = 12;
^~~~~~
我知道如何解决问题。我只是更改member=12
为this->member=12
. 我的问题是:为什么编译器不编译这个?
我会指出,尽管模板尚未以任何方式实例化,但仍会发出错误。它只是定义了两个类,仍然是模板形式。
解决方案
如果您以一种不直观地引用模板参数的方式使用名称,那么它绝对不应该依赖于模板参数!
void foo();
template <typename T>
struct A : T {
void bar() {
foo();
}
};
如果T
有一个foo
成员函数,那么调用会解析为成员而不是全局函数,这可能会非常糟糕。
如果没有全局foo
变量,您可能会争辩说它可以解析为成员函数/数据成员作为后备,但这会使语言复杂化并且可能会混淆正确(“我想调用成员foobar
,但我没有意识到那里是一个恰好具有正确签名的全局函数”)。
在您的示例中,有人可以专攻A
没有member
数据成员。member
会改用假设的全局变量吗?用this->
它是明确的。
推荐阅读
- python - 沿 i 个元素求和 3d numpy 数组 [i,j]
- specman - 打印文件名和行号以记录
- python - 如何将一个功能的小计分配给另一个功能?
- android - runOnUiThread 的目的是什么
- python - 来自sys.stdin的readlines()之后的input()?
- asp.net-core - DataTable 行返回未定义
- python - 在 Google Colab 中下载 h5 文件
- c# - 在c#中将8Mono像素数据数组转换为24位图像
- matlab - 如何检查矩阵的元素是否在MATLAB中?
- python - Discord 机器人复制和粘贴