![](/img/trans.png)
[英]C++ partial template specialization and class inheritance in template parameter
[英]Template template parameter partial specialization c++
考虑一下代码:
template<template<typename,typename> class Container>
class A {
template<class U, class Allocator>
void Foo(Container<U, Allocator>*, U);
};
现在我想专门研究A
在这种情况下,Container是一个已知Value和Comparator的地图,并在这种情况下创建Foo
的定义(没有Foo
)。 我试过这个:
template<typename V, typename Comp> template<class U, class Allocator>
void A<std::map<typename, V, Comp, typename>>::Foo(map<U, V, Comp, Allocator>*, U ) {...}
但是我收到了编译错误: C3200: 'std::map<int,V,Comp,int>' : invalid template argument for template parameter 'Container', expected a class parameter.
我已经在线查看并且只发现了类似的问题,但我找不到一种方法来仅指定模板模板的部分模板参数列表。 有办法吗?
编辑:唯一的问题是,在给出模板类时,部分特化是使其表现为具有其余参数的模板。 这里尝试将map<*,Known1,Known2,*>
视为仅有2个参数的模板(可以真正用作A
的模板模板参数)。
编辑2:我必须使用的编译器是GCC 4.1.2,它不支持模板别名,据我所知,这是一个解决方案。
问题是A
采用模板模板参数,它有两种类型:
template<template<typename,typename> Container>
class A {
但是std::map
不需要两种类型。 需要四个:
template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
这是一个问题。 您必须将模板概括为以下内容(还要注意缺少的class
关键字):
template <template <typename...> class Container>
class A { ... };
但即使如此,最多你可以完全明确地专门化一个成员函数,你不能部分专门化它:
template <>
template <>
void A<std::map>::Foo<>(std::map<U, V>*, U) { ... }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.