类型成员的继承 C++

Inheritance of Type Members C++

我试图在其子项中使用 class 的类型成员,但我失败了。特别是,我无法理解为什么这段代码无法编译:

template <typename T>
class A {
    public:
        using t = T;
        
        A() {}
};

template <typename T>
class B: public A<T> {
    public:
        B() : A<T>() {}
        
        A<T>::t foo(A<T>::t x) {
            return x;
        }
};

我也试过 A::tB::t,但其中 none 有效。也许我遗漏了一些关于如何访问继承类型成员的信息。编译器错误:

error: need ‘typename’ before ‘A<T>::t’ because ‘A<T>’ is a dependent scope
   A<T>::t foo(A<T>::t x) {

PS:我知道在这种特殊情况下我可以简单地使用 T 而不是尝试访问 A::t,但问题仍然有效。

由于 A<T>::t 依赖于模板参数,因此需要 typename:

typename A<T>::t foo(typename A<T>::t x)

因为它依赖于模板参数,所以它必须始终是合格的(即在它的左边有 ::),所以只是普通的 t 是行不通的。

typename B::t 也可以。

typename A::t 不起作用,因为 injected-class-name A 本身(即不需要模板参数的 shorthand 版本)也依赖于模板参数。您可以 typename B::A::t,但这是多余的。


如果你把这个放在你的class中:using typename A<T>::t;

然后您就可以按原样使用 t。值得注意的是,using typename B::t; 不起作用。


如果基础 class 不依赖于模板参数(例如 template <typename T> class B : public A<int>),那么 typename 就没有必要了。

在这种情况下,以下所有方法都有效:tB::tA::tB::A::t,可选地使用 [=17= 的模板参数] and/or B 指定。