【发布时间】: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 无关
-
是什么让你认为库层的深处默认为
<?如果是这样,它将被破坏,您应该提交错误报告,但很可能您误解了数据 - 在许多其他情况下会触发该错误,之前可能有人已经检测到它......当我告诉我的第一个老板说编译器出错了,他笑着说:99%的时候,问题出在椅子和键盘之间,而不是在编译器上