5

我在这里遇到了与上一个问题相同的问题: 使用模板和继承在 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 编译的。

4

1 回答 1

4

我相信描述在这种情况下适用的参数相关查找规则的标准部分是§14.6.2/3,其中规定了以下内容:

在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在类定义点的非限定名称查找期间不会检查基类范围模板或成员,或在类模板或成员的实例化期间。

由于您的基类依赖于模板参数,因此不应检查依赖的基类范围。然而,一些编译器有这个错误。例如,GCC 正在执行额外的依赖基类范围查找,这仅在版本 4.7 中得到修复(错误# 2416329131)。我不知道为什么 Visual Studio 编译器允许它。但如果是这样,那么在这方面显然不符合标准。您不应该依赖该错误,并且绝对不应该寻找具有类似错误的编译器来依赖。

于 2013-01-26T06:18:18.837 回答