2011-02-08 227 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>。该头文件明确定义了这个操作符

相关问题