2017-05-08 27 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