+= 操作符对和 make_pair 与模板
Posted
技术标签:
【中文标题】+= 操作符对和 make_pair 与模板【英文标题】:+= operator on a pair and make_pair with templates 【发布时间】: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
,我也找不到更多信息。
【问题讨论】:
也许他们定义了自己的运算符 +=? 不太可能,除非可以重载 pairmake_pair
使用了完美转发,只有在推断类型时才有效。通过指定类型,它将只接受右值。我不知道为什么错误会消失。
@immibis 是正确的。我在源文件中找到了 += 运算符。可能会超载一对的 +=,这对我来说是新信息。谢谢你。它只是相应值的添加。一定是在切换构建系统时丢失了头文件。
+= 与您的错误无关。您遇到了 C++11 破坏 C++98 代码的罕见案例之一。
【参考方案1】:
这不是关于这对,而是关于地图。 operator []
用于在地图中插入或更新元素。
例如在std::map<char, int> myMap'a', 27, 'b', 3, 'c', 1;
中,我可以执行以下操作(如上面链接的页面所示):
myMap['a'] = 6; //to change the value associated to 'a'
myMap['d'] = 8; //to insert a new value
我还可以执行以下操作:
myMap['b'] += 9; //Now the value associated to b is 3 + 9 = 12
在问题中发布的 3 行代码中,与括号内的字符串关联的值正在更新。
operator+=
对于带有模板的对可能已经超载。 (看看这个question 的答案)这可能就是为什么,你得到这些错误而不是以下错误(用字符串替换char):
error: no match for ‘operator+=’ (operand types are ‘std::map<char, std::pair<int, double> >::mapped_type aka std::pair<int, double>’ and ‘std::pair<int, double>’)
由于相同的操作不会重现相同的错误,因此问题来自更深层次的实现,您没有提供任何上下文。它们可能与左右值有关:
cannot convert ‘targetLength’ (type ‘int’) to type ‘int&&’
你[可能][1]想看看那些answers。
[1]: 可能是因为我不确定我在说什么。我想发表评论,但没有足够的代表,所以我尽力回答。
【讨论】:
谢谢,您链接的答案很有帮助。查询在 cmets 中得到了回答。这是一个 c++98 的东西,我正在用 c++11 编译。之后编译成功。以上是关于+= 操作符对和 make_pair 与模板的主要内容,如果未能解决你的问题,请参考以下文章