2017-05-08 54 views
2

我在阅读库的代码库时遇到以下内容。+ =一对运算符和make_pair带模板

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和其他站点上的文档对,他们都没有指定一对+=运算符。这是我第一次遇到带有模板参数的make_pair,我也无法找到更多信息。

+0

也许他们定义了自己的operator + =? – immibis

+0

不太可能,除非可能超载对的+ =运算符。那可能吗? – jerin

+1

我认为这个错误是因为'make_pair'使用了完美的转发,它只在它推导出类型时才起作用。通过指定类型,它将只接受rvalues。我不知道为什么错误会消失。 –

回答

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)这可能是为什么,你得到的,而不是以下(含字符串替换字符)的错误:

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]:可能是因为我不确定我在说什么。我想提供一个评论,但没有足够的代表,所以我尽力回答。

+0

谢谢,你已经链接的答案是相当有帮助的。查询在评论中得到解答。这是一个C++ 98的东西,我正在用C++ 11编译。它在编译成功后。 – jerin