假设我有这个:
template<int W, int H>
struct A
{
A()
{
std::cout << W << " - " << H << std::endl;
}
};
我还有另一个需要
A
结构的结构:
template<template<int W, int H> typename A>
struct B
{
B()
{
std::cout << W << " - " << H << std::endl;
}
};
我的问题是,如何实例化
B
?我应该在什么时候提供int
的?
int main()
{
B<A<50, 50>> b; // "A<50, 50>" is not a template class
return 0;
}
我在
B
结构上的模板到模板声明有什么问题吗?
这不是你想的那样。写作时,
template<template<int W, int H> typename A>
struct B
,
A
与您之前定义的 template<int, int> struct A
无关(类似于局部变量在其范围内隐藏全局变量)。您给出的定义需要一个 template class(例如,A
,但没有参数),因此 W
和 H
将在内部不可用。事实上,我们通常不会写这些参数的名称来表示这一点,但这只是一种约定。
如果您想采用具体的
A<W, H>
,那么也许您能做的最好的事情就是专注于此:
template<typename A_>
struct B;
template<int W, int H>
struct B<A<W, H>>
{
// current body of class B
}
然后你的代码就可以工作了。另一种可能性是为
constexpr
中的 W
和 H
提供 (A
) 吸气剂,但即便如此,您也需要在 B
的定义中学习具体课程。
另一种方法是将 W 和 H 定义为 A 类中的常量。
template<int W_, int H_>
struct A
{
static const int W = W_;
static const int H = H_;
A()
{
std::cout << W << " - " << H << std::endl;
}
};
template<typename T>
struct B
{
B()
{
std::cout << T::W << " - " << T::H << std::endl;
}
};
int main()
{
B<A<50, 50>> b;
return 0;
}
如果你想为任何类型提供两个
int
作为模板参数,你可以做一个特化:
template <class> struct B; // primary template
// specialization for any `T<int, int>`, such as `A<50, 50>`:
template <template <int, int> class T, int W, int H>
struct B<T<W, H>> {
B() {
std::cout << W << " - " << H << std::endl;
}
};