我正在尝试在派生类中使用模板化基类的成员变量,如下例所示:
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中的错误?
答案 0 :(得分:5)
您可能正在icc中以非严格模式进行编译。无论如何,由于x
是不合格的,因此不应在任何依赖于模板参数的基类中查找它。因此,在您的代码中,找不到x
的位置,并且您的代码无效。
使用其他形式的查找(类成员访问查找和限定查找)查找其他名称。这两种形式都可以查看依赖的基类(如果它们是相关的,并且因此在知道dtype
时实例化模板时查找 - 所有其他名称都依赖于模板参数)。
即使是最新版本的GCC也没有正确实现,并且在非限定查找期间也会使用某些相关名称still resolve against dependent bases。