类型成员的继承 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::t
和 B::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
就没有必要了。
在这种情况下,以下所有方法都有效:t
、B::t
、A::t
、B::A::t
,可选地使用 [=17= 的模板参数] and/or B
指定。
我试图在其子项中使用 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::t
和 B::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
就没有必要了。
在这种情况下,以下所有方法都有效:t
、B::t
、A::t
、B::A::t
,可选地使用 [=17= 的模板参数] and/or B
指定。