2012-09-02 194 views
0

我試圖做一個聲明STL的地圖,像這樣的模板參數: (假設T作爲類型名,像這樣:template <class T>初始化STL類與模板參數

map<T, T> m;(在.h文件中)

它編譯好。現在在我的cpp文件中,當我想插入地圖時,我無法。我在intellisense上獲得的唯一方法是「at」和「swap」方法。

任何想法?請人嗎?

在此先感謝。

這裏是示例代碼:

#pragma once 

#include <iostream> 
#include <map> 

using namespace std; 

template <class T> 

class MySample 
{ 
map<T, T> myMap; 
//other details omitted 

public: 

//constructor 
MySample(T t) 
{ 
    //here I am not able to use any map methods. 
    //for example i want to insert some elements into the map 
    //but the only methods I can see with Visual Studio intellisense 
    //are the "at" and "swap" and two other operators 
    //Why??? 
    myMap. 
} 

//destructor 
~MySample(void) 
{ 

} 
//other details omitted 
}; 
+0

任何人都可以嗎? – lat

+0

發表一些代碼...我們不在你的屏幕前,所以你可能想幫助我們理解你的問題,如果你想要的答案... – Macmade

+0

我添加了一些示例代碼。讓我知道我所做的是錯的。 – lat

回答

1

通常的方式來插入鍵 - 值對的一個std::map是指數運算符的語法以及所述insert功能。我會承擔價值std::string密鑰和int爲例子的目的:

#include <map> 
#include <string> 

std::map<std::string,int> m; 
m["hello"] = 4; // insert a pair ("hello",4) 
m.insert(std::make_pair("hello",4)); // alternative way of doing the same 

如果你可以使用C++ 11,你可以使用,而不是make_pair調用新的統一初始化語法:

m.insert({"hello",4}); 

而且,作爲評價所述,有

m.emplace("hello",4); 

在C++ 11,它構造新的鍵 - 值對就地拉特呃不是構造它的地圖之外,並複製它。


我要補充一點,因爲你的問題其實是關於初始化,而不是插入的新鮮元素,並考慮到你確實做到這一點在構造函數MyClass,你應該怎麼做(在C++ 11)是這樣的:

MySample(T t) 
: myMap { { t,val(t) } } 
{} 

(這裏我認爲有一些功能val產生了t在地圖存儲值)。

+1

在C++ 11中,您也可以使用[emplace](http://en.cppreference.com/w/cpp/container/map/emplace)。 –

+0

我添加了一些示例代碼。讓我知道我所做的是錯的。 – lat

+0

@MarceloCantos所以你的確可以!謝謝。 (儘管我的GCC 4.7.0 STL實現似乎沒有定義'std :: map <> :: emplace')。) – jogojapan