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

时间:2010-04-29 16:24:24

标签: c++ inheritance templates compiler-construction

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

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
    }
};

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

1 个答案:

答案 0 :(得分:5)

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

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

即使是最新版本的GCC也没有正确实现,并且在非限定查找期间也会使用某些相关名称still resolve against dependent bases