我想在.NET 4.0中使用std :: map。当然,我们知道map是一棵树,需要一个操作符<,而string没有为我们定义该操作符。
错误24 错误C2676:二进制'<':'const std::string'未定义此运算符或可接受预定义运算符的类型转换 c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer
因此,我利用谷歌搜索找到了这个解决方案:
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框架的深处,似乎它忽略了上面的定义,并默认使用operator<。在VS2010 .NET 4.0中,有没有一种方法可以将字符串用作map的键?
我知道我可以获取该字符串并编写一个函数将其哈希为int,但这有何乐趣呢?
编辑:
我会尽力向David解释这个问题。当map使用比较器结构时,在发布版本中会崩溃,在调试版本中会失败。失败的断言位于xtree的1746行。
表达式:invalid operator< |终止| |重试| |忽略|
这就是让我相信,尽管给map提供了一个比较器,它仍会沿某些路径默认使用operator<进行比较。引起此问题的代码行是:
CustomObject o = stringObjectMap[key];
<
运算符是什么让您这样想的?如果真的是这样,那就有问题了,您应该提交一个错误报告,但很可能您误解了数据--这种错误会在许多其他情况下触发,早就被发现了... 当我告诉我的第一任老板编译器出错时,他微笑着说:“99%的情况下,问题出在椅子和键盘之间,而不是编译器本身。” - David Rodríguez - dribeas