c++ - 模板模板参数偏特化c++

标签 c++ templates

考虑代码:

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/

相关文章:

c++ - remove_if 字符串匹配集合中的给定字符串

c++ - C++中如何在另一个模板类中使用一个模板类

c++ - 使 C++ 模拟类同时使用 2D 和 3D vector

c++ - 在单次调用c++中将整个二进制文件读入数组

c++ - 为什么调用 printf ("%p",这个);删除后;非法的?

c++ - 安置新的和继承

c++ - 模板类可以有纯虚函数和虚运算符吗?

c++ - 用原始类型替换模板类

c++ - 确定类是否实现 operator() 的任何方法

c++ - 将 vector<int*> 视为 vector<const int*> 而无需复制 (C++0x)