[英]template class partial specialization with different non-type template parameter
[英]Partial specialization of type parameter in template class with type & template template parameters
我想专门研究以下模板类的类型参数,它具有一个类型参数和一个模板模板参数:
template <
typename T,
template <typename E> class Foo
> class Bar;
我尝试了以下每个摘录的最后一行中添加和/或省略.template
和typename
每个排列,但是没有一个编译:
1.)
template <
template <typename E> class Foo
> class Bar<int, Foo<typename E>>;
2.)
template <
template <typename E> class Foo
> class Bar<int, Foo.template <typename E>>;
3.)
template <
template <typename E> class Foo
> class Bar<int, Foo<E>>;
4.)
template <
template <typename E> class Foo
class Bar<int, Foo.template <E>>;
为什么它们中的任何一个都不起作用?
关于每个适用代码段的最后一行:
typename
澄清E
是由类使用的类型Foo
,或可在此语法只有内使用{}
身体的Bar
的类定义? template
是否无法阐明Foo
是模板,因此阻止编译器解析Foo <
因为Foo
“小于”,或者该语法只能在Bar
的类定义的{}
主体内使用吗? 我该如何工作?
不
typename
澄清E
是由类使用的类型Foo
,或可在此语法只有内使用{}
身体的Bar
的类定义?
仅当在模板定义中定义类型(也可以使用class
)或访问依赖类型(取决于模板参数的类型)时,才使用typename
。
有关更多信息(甚至有关何时使用template
信息),请参见此线程 。
我该如何工作?
模板模板参数中的类型名称实际上无法使用。 它只是形式而已。 您必须向主模板添加另一个模板参数:
template <
template<typename> class Foo,
typename E
> class Bar<int, Foo<E>> { ... };
而且,如果这是模板Bar
,那么Bar
需要一个主模板来特化:
template<typename T, typename U>
struct Bar;
template <
template<typename> class Foo,
typename E
> class Bar<int, Foo<E>> { ... };
像这样:
template <template <typename E> class Foo>
class Bar<int, Foo>
{
// ...
};
您甚至可以省略内部参数名称E
,因为它没有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.