将未声明的标识符与模板和继承跟进一起使用
use of undeclared identifier with templates and inheritance followup
我在这里遇到了与上一个问题相同的问题:在模板和继承C++中使用未声明的标识符
总而言之,我们尝试从子类访问模板类的受保护属性。所描述的方法是使用 this->attribute
而不是仅使用 attribute
.问题是,我想知道为什么Visual Studio 2012不需要在变量引用前面添加this->,以便程序正确编译和执行。我也想知道是否有办法在 gcc 或 OS X 上的其他编译器中使用该功能。
编辑:这是我在Visual Studio 2012中用于测试的代码。
//file a.h
template<class T>
class a
{
public:
a(){value = 2;};
protected:
T value;
};
template<class T>
class b: public a<T>
{
public:
T getValue(){return value;};
};
//file main.cpp
#include <iostream>
#include "a.h"
using namespace std;
int main()
{
b<int> myTest;
cout<<myTest.getValue();
system("pause");
return 0;
}
这不会使用 g++ 进行编译,但使用 Visual Studio 2012 进行编译。
我相信描述适用于这种情况的参数相关查找规则的标准部分是 §14.6.2/3,其中声明如下:
在类模板或类模板的成员的定义中, 如果类模板的基类依赖于模板参数, 在非限定名称查找期间不检查基类作用域 在类模板或成员的定义点,或者 在类模板或成员的实例化期间。
由于基类依赖于模板参数,因此不应检查依赖基类范围。但是,一些编译器对此表示错误。例如,GCC 正在执行额外的依赖基类范围查找,仅在版本 4.7 中修复(Bug# 24163、29131)。我不知道为什么Visual Studio编译器允许它。但如果是这样,那么它在这方面显然不符合标准。您不应该依赖该错误,也绝对不应该寻找具有类似错误的编译器。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 将未声明的标识符与模板和继承跟进一起使用