从派生类访问基类中的类型别名

nim*_*ims 3 c++ templates c++17

当尝试从派生类访问基类中的类型别名时,我面临以下问题:

template <typename T>
class A {
    public:
        using T2 = T;
};

template <typename T>
class B: public A<T> {
    public:
        typename A<T>::T2 obj1;  // OK
        T2 obj2;  // Error
};

template <typename T>
class C: public A<int> {
    public:
        typename A<int>::T2 obj1;  // OK
        T2 obj2;  // OK
};

Run Code Online (Sandbox Code Playgroud)

我无法理解为什么使用显式类型初始化基类可以让我们访问基类中的类型别名,但在第一种情况下,它会导致错误。

提前致谢。

son*_*yao 5

T2是一个非依赖名称。非依赖名称不会在依赖基类(例如 )中查找A<T>,这取决于模板参数T

A<T>::T2有效,它是从属名称。依赖名称只能在实例化时查找,那时才能知道必须探索的确切基础专业化。

另一方面,当基类是A<int>代码时,代码可以工作,因为A<int>它是一个非依赖基类,并且非依赖名称T2将在 的范围内找到A<int>