使用模板化 class 类型在给定模板参数的 class 中声明变量
Declaring variable inside a class with templated class type given template parameter
我正在尝试实例化包含在作为模板参数给出的 class 中的模板 class。通过示例可能更容易理解:
struct A {
static constexpr int a = 42;
class B {
int b;
};
template<typename X>
class C {
X c;
};
};
template<typename U, typename T>
class D {
int a = U::a;
using B = typename U::B;
B b;
//using C = typename U::C;
// C<T> c;
A::C<T> e;
};
int main(void) {
D<A, int> d;
return 0;
}
如果我取消对注释行的注释,编译器会给我一个错误,提示 C 不是模板。我尝试了其他方法来实例化这个变量,但没有用。我想要 e 变量的等价物,但使用 U 类型名称。
注意你没有将C
声明为模板类型,那么C<T> c
将导致错误,因为你不能将其用作模板类型。
你要的是alias template(类型族的名称),正确的语法是:
template <typename Z>
using C = typename U::template C<Z>;
然后
C<T> c; // same as U::template C<T>; Z is substituted with T
与D<A, int> d;
、U
=A
和T
=int
,那么D
里面的C<T>
是一样的作为 A::C<int>
.
我正在尝试实例化包含在作为模板参数给出的 class 中的模板 class。通过示例可能更容易理解:
struct A {
static constexpr int a = 42;
class B {
int b;
};
template<typename X>
class C {
X c;
};
};
template<typename U, typename T>
class D {
int a = U::a;
using B = typename U::B;
B b;
//using C = typename U::C;
// C<T> c;
A::C<T> e;
};
int main(void) {
D<A, int> d;
return 0;
}
如果我取消对注释行的注释,编译器会给我一个错误,提示 C 不是模板。我尝试了其他方法来实例化这个变量,但没有用。我想要 e 变量的等价物,但使用 U 类型名称。
注意你没有将C
声明为模板类型,那么C<T> c
将导致错误,因为你不能将其用作模板类型。
你要的是alias template(类型族的名称),正确的语法是:
template <typename Z>
using C = typename U::template C<Z>;
然后
C<T> c; // same as U::template C<T>; Z is substituted with T
与D<A, int> d;
、U
=A
和T
=int
,那么D
里面的C<T>
是一样的作为 A::C<int>
.