2014-03-06 99 views
2

我想編寫一個函數模板來處理向量,列表,集合... 並且想要分別編寫專門化函數來處理映射, 編寫了下面的代碼,編譯器報告錯誤。使用tempates作爲參數時的函數模板專業化

任何一個可以幫助我如何修改它?

#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

什麼樣的錯誤? – songyuanyao

+0

; ---------使用code :: blocks + gcc4.7.1編譯舊代碼時出現以下錯誤: mingw32-g ++。exe -Wall -fexceptions -std = C++ 11 -g -c main.cpp -o obj \ Debug \ main.o main.cpp:138:16:錯誤:模板參數數量錯誤(0,應該是4)在從c:\ mingw \ bin ../ lib包含的文件中/gcc/mingw32/4.7.1/include/c++/map:61:0,from main.cpp:11:c:\ mingw \ bin ../ lib/gcc/mingw32/4.7.1/include/C++/bits /stl_map.h:90:11:錯誤:爲'模板類std :: map'main.cpp:138:6提供:錯誤:template test'test < >'for'void test()'不匹配任何模板聲明 – shavian

回答

2

模板專門應該是:

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

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

我從map<> class T這是無效的語法到std::map改變模板參數。並且我將T<string, int>更改爲std::map<string, int>,因爲名稱T不存在於專業化中。

+0

非常感謝,現在就完成這項工作。 – shavian

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 
}