使用从模板化基类继承的成员变量(C++)

Aar*_*ker 6 c++ compiler-construction inheritance templates

我试图在派生类中使用模板化基类的成员变量,如下例所示:

template <class dtype>
struct A {
    int x;
};

template <class dtype>
struct B : public A<dtype> {
    void test() {
        int id1 = this->x;      // always works
        int id2 = A<dtype>::x;  // always works
        int id3 = B::x;         // always works
        int id4 = x;            // fails in gcc & clang, works in icc and xlc
    }
};
Run Code Online (Sandbox Code Playgroud)

gcc和clang都非常挑剔使用这个变量,并且要求显式范围或明确使用"this".使用其他一些编译器(xlc和icc),事情就像我期望的那样工作.这是xlc和icc的情况,允许代码不是标准的,还是gcc和clang中的错误?

Joh*_*itb 5

您可能正在icc中以非严格模式进行编译.无论如何,因为x是不合格的,所以不应该在依赖于模板参数的任何基类中查找它.因此,在您的代码中,没有x找到的地方,并且您的代码无效.

使用其他形式的查找(类成员访问查找和限定查找)查找其他名称.如果它们都可以,那么这两种形式都将查看依赖的基类(即如果它们是相关的,并且因此在dtype知道时实例化模板时查找- 所有其他名称都依赖于模板参数).

甚至GCC在其最新版本中也没有正确实现,并且在非限定查找期间,某些依赖名称仍然会针对依赖基础进行解析.