【发布时间】:2017-05-08 04:43:06
【问题描述】:
我在阅读库的代码库时遇到了以下问题。
errorMap,下面代码中使用的定义为:
map <const string, pair<int, double>> errorMap;
代码的相关部分是:
errorMap["substitutions"] += make_pair<int,double>(targetLength, substitutions);
errorMap["insertions"] += make_pair<int,double>(targetLength, insertions);
errorMap["deletions"] += make_pair<int,double>(targetLength, deletions);
以上部分抛出this编译错误。当通过它自己的构建系统运行库时,代码似乎正在编译。有人能解释一下这里到底发生了什么吗?
PS:我已经在 cppreference 和其他网站上查看了 pair 文档,它们都没有为 pair 指定 += 运算符。这是我第一次遇到带有模板化参数的make_pair,我也找不到更多信息。
【问题讨论】:
-
也许他们定义了自己的运算符 +=?
-
不太可能,除非可以重载 pair
的 += 运算符。这可能吗? -
我认为这个错误是因为
make_pair使用了完美转发,只有在推断类型时才有效。通过指定类型,它将只接受右值。我不知道为什么错误会消失。 -
@immibis 是正确的。我在源文件中找到了 += 运算符。可能会超载一对的 +=,这对我来说是新信息。谢谢你。它只是相应值的添加。一定是在切换构建系统时丢失了头文件。
-
+= 与您的错误无关。您遇到了 C++11 破坏 C++98 代码的罕见案例之一。