考虑代码:
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) { ... }
关于c++ - 模板模板参数偏特化c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30824473/