我正在尝试在派生类中使用模板化基类的成员变量,如下例所示:
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 中的错误?
您可能在 icc 中以非严格模式进行编译。无论如何,由于
x
是不合格的,因此不应在依赖于模板参数的任何基类中查找它。所以在你的代码中,没有找到x
的地方,你的代码是无效的。
其他名称使用另一种查找形式(类成员访问查找和限定查找)进行查找。如果可以的话,这两种形式都会查找依赖基类(即,如果它们是依赖的,因此在已知
dtype
时实例化模板时会进行查找 - 所有其他名称都依赖于模板参数)。
即使最新版本的 GCC 也不能正确实现这一点,并且一些依赖名称 在不合格查找期间仍然会解析依赖基数。