2011-02-08 228 views
23

我想要一個std :: map(int .NET 4.0)。我們當然知道一張地圖是一棵樹,並且需要一個字符串沒有爲我們定義的操作符<。使用std :: string作爲std :: map的鍵

錯誤24錯誤C2676:二進制 '<': '常量的std :: string' 不限定此運算符或轉換到類型接受的預定義操作C:\程序Files \ Microsoft的Visual Studio 10.0 \ VC \包括\ xfunctional 125 1 FXCMMarketDataServer

所以我把我的谷歌,FOO上班,發現此解決方案:

struct StringComparerForMap 
{ 
public: 
    bool operator()(const std::string x, const std::string y) 
    { 
     // Add compare logic here 
    } 
}; 

... 
std::map<std::string, CustomObject, StringComparerForMap> myMap; 

這一段時間工作得很好,現在我遇到一個bug我相信這是由於這一點。在STL框架內部的某處,似乎忽略了上述定義,並默認爲運營商<。

有沒有在VS2010 .NET 4.0中使用字符串作爲地圖的關鍵的方法?

據我所知,我可以採取該字符串,並寫一個函數將其散列到一個int,但在那裏的樂趣呢?

編輯

我會嘗試盡我所能爲大衛解釋。當映射使用比較器結構時,它在發行版中崩潰並在調試中失敗調試斷言。失敗的斷言是行的XTree 1746

表達:無效操作<

|中止| |重試| |忽略|

那是什麼使我相信,儘管給映射比較器,它仍然下來某些路徑默認爲運營商<進行比較。使這在我的代碼行是:

CustomObject o = stringObjectMap[key]; 
+7

std :: string確實具有所需操作符的合適定義。你確定你已經包含頭文件嗎?我想我沒有看到類似的問題, std :: string的前向聲明意味着它的名字本身是已知的。 – Keith 2011-02-08 22:30:22

+3

.NET與std :: map或std :: string無關 – 2011-02-08 22:41:40

回答

67

錯誤24錯誤C2676:二進制「<」:「常量的std :: string」不定義這種操作或轉換到一個類型可以接受的預定義運算C:\ Program Files文件\微軟的Visual Studio 10.0 \ VC \包括\ xfunctional 125 1 FXCMMarketDataServer

這就是VC吐到你的臉,當你忘了,包括<string>。該頭文件明確定義了這個操作符

相關問題