使用模板作为参数时的函数模板特化

时间:2014-03-06 09:17:17

标签: c++ templates

我想编写一个函数模板来处理向量,列表,集合...... 并且想要编写专门化函数来分别处理地图, 当我编写以下代码并且编译器报告错误时。

任何人都可以帮我修改它吗?

#include <iostream>
#include <string>
#include <map>
#include <unordered_map>
using namespace std;

// test() for the vectors, lists, sets, ...

template <template <typename...> class T>
void test()
{
    T<string, int> x;
    //...
}

// specialize test() for map
template <>
void test <map<> class T>()
{

    T<string, int> x;
    //...
}


int main()
{
    test<map>();
    test<unordered_map>();
}

2 个答案:

答案 0 :(得分:2)

模板专业化应该是:

template <>
void test <std::map>()
{

    std::map<string, int> x;
}

我将模板参数从map<> class T(无效语法)更改为std::map。我将T<string, int>更改为std::map<string, int>,因为专业化中不存在名称T

答案 1 :(得分:0)

以下是完整的代码:

#include <iostream>
#include <string>
#include <map>
#include <unordered_map>
using namespace std;

template <template <typename...> class T, typename TN>
void test()
{
    cout << "---------- test case 1" << endl;
    T<TN, int> x;
}

template <template <typename...> class T>
void test()
{
    cout << "---------- test case 2" << endl;
    T<string, int> x;
}

template <> 
void test < map,string >()
{
    cout << "---------- test case 3" << endl;
    map<string, int> x;
}

template <> 
void test < map >()
{
    cout << "---------- test case 4" << endl;
    map<string, int> x;
}

int main()
{
    test<unordered_map,string>(); // trigging test case 1
    test<unordered_map>();        // trigging test case 2
    test<map,string>();           // trigging test case 3
    test<map>();                  // trigging test case 4
}