使用std::string作为std::map的键

23

我想在.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];

7
std::string确实有所需运算符的合适定义。您确定已经包含了<string>头文件吗?我认为当我没有包含它时,我也遇到过类似的问题;std::string的前向声明意味着其名称本身是已知的。 - Keith
3
.NET 与 std::map 或 std::string 没有任何关系。 - Chris Card
3
您认为在图书馆层深处会默认使用 < 运算符是什么让您这样想的?如果真的是这样,那就有问题了,您应该提交一个错误报告,但很可能您误解了数据--这种错误会在许多其他情况下触发,早就被发现了... 当我告诉我的第一任老板编译器出错时,他微笑着说:“99%的情况下,问题出在椅子和键盘之间,而不是编译器本身。” - David Rodríguez - dribeas
1个回答

72

错误 24 错误 C2676:二进制“<”:“const std::string”未定义此运算符或不提供预定义运算符所需的类型转换 c:\program files\microsoft visual studio 10.0\vc\include\xfunctional 125 1 FXCMMarketDataServer

当你忘记包含<string>时,VC会向你抛出这个错误。这个头文件确实定义了这个运算符。


1
这刚刚发生在我身上,我花了一个小时玩地图,一遍又一遍地出现这个错误。我想:“为什么互联网上的每个例子都失败了!” 结果是我忘记了该死的字符串头文件。现在感觉有点傻.... - Joseph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接