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

问题描述 投票:0回答:1

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

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 中的错误?

c++ templates inheritance
1个回答
5
投票

您可能在 icc 中以非严格模式进行编译。无论如何,由于

x
是不合格的,因此不应在依赖于模板参数的任何基类中查找它。所以在你的代码中,没有找到
x
的地方,你的代码是无效的。

其他名称使用另一种查找形式(类成员访问查找和限定查找)进行查找。如果可以的话,这两种形式都会查找依赖基类(即,如果它们是依赖的,因此在已知

dtype
时实例化模板时会进行查找 - 所有其他名称都依赖于模板参数)。

即使最新版本的 GCC 也不能正确实现这一点,并且一些依赖名称 在不合格查找期间仍然会解析依赖基数

© www.soinside.com 2019 - 2024. All rights reserved.