【问题标题】:Using an std::string as a key for an std::map使用 std::string 作为 std::map 的键
【发布时间】:2011-06-23 18:39:08
【问题描述】:

我想要一个 std::map (int .NET 4.0)。我们当然知道地图是一棵树,并且需要一个 operator

错误 24 错误 C2676: 二进制 '

所以我让我的 google-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;

这在一段时间内工作得很好,现在我遇到了一个我认为是由于这个原因的错误。在 STL 框架的某个深处,它似乎忽略了上述定义并默认为 operator<.>

在 VS2010 .NET 4.0 中有没有办法使用字符串作为映射的键?

我知道我可以获取该字符串并编写一个函数将其散列为一个 int,但其中的乐趣在哪里?

编辑

我会尽力为大卫解释这一点。当映射使用比较器结构时,它会在发布时崩溃,并在调试中使调试断言失败。失败的断言在 xtree 第 1746 行。

表达式:无效的运算符

|中止| |重试| |忽略|

这让我相信,尽管给 map 一个比较器,但它仍然在某些路径下默认为 operator

CustomObject o = stringObjectMap[key];

【问题讨论】:

  • std::string 确实有所需运算符的合适定义。您确定您已包含 标头吗?我想当我没有包含它时,我已经看到了类似的问题; std::string 的前向声明意味着它的名称本身是已知的。
  • .NET 与 std::map 或 std::string 无关
  • 是什么让你认为库层的深处默认为&lt;?如果是这样,它将被破坏,您应该提交错误报告,但很可能您误解了数据 - 在许多其他情况下会触发该错误,之前可能有人已经检测到它......当我告诉我的第一个老板说编译器出错了,他笑着说:99%的时候,问题出在椅子和键盘之间,而不是在编译器上

标签: c++ string stl map


【解决方案1】:

错误 24 错误 C2676: 二进制 '

当您忘记包含&lt;string&gt; 时,这就是 VC 吐在您脸上的东西。该标头明确定义了此运算符。

【讨论】:

  • 这只是发生在我身上,花了一个小时玩地图,然后一遍又一遍地出现这个错误。我想“为什么互联网上的每个例子都失败了!”。原来我忘记了一个该死的字符串标题。我现在觉得有点傻......
猜你喜欢
  • 1970-01-01
  • 2012-01-06
  • 2014-08-06
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多