将未声明的标识符与模板和继承跟进一起使用

use of undeclared identifier with templates and inheritance followup

本文关键字:跟进 继承 一起 未声明 标识符      更新时间:2023-10-16

我在这里遇到了与上一个问题相同的问题:在模板和继承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编译器允许它。但如果是这样,那么它在这方面显然不符合标准。您不应该依赖该错误,也绝对不应该寻找具有类似错误的编译器。