使用未声明的标识符和模板以及继承跟进

Sam*_*Sam 5 c++ macos gcc compilation visual-studio-2012

我遇到了与上一个问题相同的问题: 在C++中使用未声明的标识符和模板以及继承

总结一下,我们尝试从子类访问模板类的protected属性.所描述的方法是使用this->attribute而不是仅使用attribute.问题是,我想知道为什么visual studio 2012不需要在程序的变量引用前添加this->来正确编译和执行.我还想知道是否有办法在OS X上的gcc或其他编译器中使用该功能.

编辑:这是我用于在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;
}
Run Code Online (Sandbox Code Playgroud)

这不是使用g ++编译,而是使用visual studio 2012.

小智 4

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

\n\n
\n

在类模板或类模板成员的定义中,\n 如果类模板的基类依赖于模板参数,\n 在非限定名称查找期间\n 不会检查基类作用域\n类模板或成员的定义点或者\n 在类模板或成员的实例化过程中。

\n
\n\n

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

\n