+= 操作符对和 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,我也找不到更多信息。

【问题讨论】:

也许他们定义了自己的运算符 +=? 不太可能,除非可以重载 pair 的 += 运算符。这可能吗? 我认为这个错误是因为make_pair使用了完美转发,只有在推断类型时才有效。通过指定类型,它将只接受右值。我不知道为什么错误会消失。 @immibis 是正确的。我在源文件中找到了 += 运算符。可能会超载一对的 +=,这对我来说是新信息。谢谢你。它只是相应值的添加。一定是在切换构建系统时丢失了头文件。 += 与您的错误无关。您遇到了 C++11 破坏 C++98 代码的罕见案例之一。 【参考方案1】:

这不是关于这对,而是关于地图。 operator [] 用于在地图中插入或更新元素。

例如在std::map&lt;char, int&gt; 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 与模板的主要内容,如果未能解决你的问题,请参考以下文章

函数模板与类模板

For 循环与应用模板

Vue实践与总结——模板、渲染、响应式

数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例

Airflow Jinja模板无法与自定义操作员一起使用

Effective C++笔记(10)—模板与泛型编程