2012-10-08 17 views
0

我宣佈STD:下圖:如何把性病::設置成的std ::地圖

std::map<std::string, std::set<unsigned char*>> FilesMap; 

int InsertData(unsigned char* name) 
{ 
    // here i try to insert pair with name above and clear std::set 
    FilesMap.insert(std::pair<std::string, std::set<unsigned char*>>(std::string((char*)name), std::set<unsigned char*>())); 
} 

但是我有很多這樣的錯誤:

錯誤16錯誤C2676:二進制「< 「: '常量的std :: string' 不限定 這個操作符或轉換到類型接受的預定義的運算符 C:\程序文件(86)\微軟的Visual Studio 10.0 \ VC \包括\ xfunctional

我在做什麼錯?

+1

我們是否假定您正在使用C++ 11或者您的'>>'結束標記中實際上是否有空格? –

+3

它在我的機器上使用VS2010編譯正確。那麼,假設你已經包含了'',''和''。 – Gorpik

+0

@MarkB MSVC在很長時間內瞭解模板中的「>>」。在標準化之前很久。 – Fiktik

回答

3

首先,這個可怕的長線

FilesMap.insert(std::pair<std::string, std::set<unsigned char*>>(std::string((char*)name), std::set<unsigned char*>())); 

可以,如果你使用std :: make_pair功能,這將演繹模板參數進行簡化。

FilesMap.insert(std::make_pair(std::string(reinterpret_cast<char*>name)), std::set<unsigned char*>())); 

其次,你可以做一個類型定義爲您的設定,以簡化上述行更

typedef std::set<unsigned char*> mySetType; 
std::map<std::string, mySetType>> FilesMap; 
FilesMap.insert(std::make_pair(std::string(reinterpret_cast<char*>name)), MySetType())); 

最後,也是最重要的,我相信原因,編譯器是無法爲std :: string找到合適的operator <是你忘記了#include<string>

+0

你沒有解決錯誤的原因,他不想要比較,它的模板解析錯誤 – jozefg

+0

然而,使用'make_pair'的簡單形式可以消除有問題的'>>'並且仍然應該解決問題。 –

+0

@jozefg:其實,你錯了,我是對的。錯誤在於編譯器找不到字符串的操作符<,用作映射鍵。不是關閉>>哪個MSVC現在處理好了很長一段時間... –

0

使用std :: map的要求是密鑰類型必須有一個operator <。看來你得到一個關於std :: string沒有這個運算符的錯誤。確保你已經包含字符串標題#include <string>

+0

他使用MSVC處理關閉>>很好... –

+0

@ArmenTsirunyan謝謝,不知道關於MSVC –

相關問題