2013-05-16 39 views
0

我正在嘗試創建一個通用的map,它將以any datatype作爲第二個要素。 但是,當我試圖創建一個對象,我得到錯誤的argument list for class template is missing如何在C++中使用模板製作通用映射

template<typename T1> 
class MAP{ 
public: 
    std::map<string, T1>Hello; 

    //MAP(){Hello["Hello"] = 3;} 
}; 

int main() 
{ 
    MAP map1;//Error happens here 

    return 0; 
} 

這是怎麼回事錯在這裏?

+2

'MAP'不是一個類型。 'MAP '是。 'MAP '是。 'MAP '是。 'MAP '是。 – chris

+3

如果您希望單個地圖對象能夠同時存儲多種不同類型的元素,您需要停下來思考一次。你會用這樣的地圖做什麼?你將如何操作其元素?否則,你已經有了一個通用映射,它被稱爲'std :: map'。 –

+3

@chris'MAP '不是一種類型,它是一個錯誤。 'MAP >'是一種類型。 – Angew

回答

4

基於您的代碼示例,而不是對問題的描述,它看起來像你試圖實現用別名模板表達出來的:

template <typename V> 
using MAP = std::map<std::string, V>; 

這就要求C++ 11的支持。但MAP的實例只能有一個映射類型V,如在您的代碼示例中。

MAP<int> mi; // std::map<std::string, int> 
MAP<double> md; // std::map<std::string, double> 

如果你想存儲任何類型的映射類型,你可以考慮使用地圖Boost.Any

using ANYMAP = std::map<std::string, boost::any>; 

ANYMAP m; 
m["Hello"] = 42; 
m["Bye"] = std::string("message"); 

但你必須仔細考慮如何使用這種結構。

1

我想添加評論。但我找不到如何添加評論。好的。添加到juanchopanza的答案。

有時候,我這樣做。

typedef map MAP<int> 

是否有效?

+0

是的,如果使用問題或我的答案中顯示的「MAP」。但它並沒有達到很多(只保存一些輸入),並且引入了一個潛在的與std :: map相沖突的名字。 – juanchopanza

+0

評論需要50點聲望。這適用於單個類型,但不是任何類型,就像答案一樣。 – chris

+1

其實它應該是'typedef MAP map'。 – juanchopanza