2017-05-08 2 views
2

Ich stieß beim Lesen der Codebasis einer Bibliothek auf Folgendes. + = Operator auf einem Paar und make_pair mit Vorlagen

map <const string, pair<int, double>> errorMap; 

und der relevante Teil des Codes Wesens

:

errorMap wird, wie in der unten definierten Code verwendet

errorMap["substitutions"] += make_pair<int,double>(targetLength, substitutions); 
errorMap["insertions"] += make_pair<int,double>(targetLength, insertions); 
errorMap["deletions"] += make_pair<int,double>(targetLength, deletions); 

Der obige Teil this Kompilierungsfehler wirft. Wenn die Bibliothek über ihr eigenes Build-System ausgeführt wird, scheint der Code zu kompilieren. Kann jemand etwas Licht auf das werfen, was genau hier passiert?

PS: Ich habe bereits die Paar-Dokumentation an cppreference und anderen Standorten betrachtet, keiner von ihnen einen += Operator für ein Paar angeben. Dies ist das erste Mal, dass ich auf eine make_pair mit Vorlagenvorlagen stoße, auf der ich auch keine weiteren Informationen finden kann.

+0

Vielleicht haben sie ihren eigenen Operator definiert + =? – immibis

+0

Unwahrscheinlich, außer es ist möglich, das Paar 's + = Operator zu überlasten. Ist das möglich? – jerin

+1

Ich denke, der Fehler ist, weil 'make_pair' die perfekte Weiterleitung verwendet, die nur funktioniert, wenn es den Typ ableitet. Durch die Angabe der Typen akzeptiert es nur rvalues. Ich weiß nicht, warum der Fehler weggehen würde. –

Antwort

1

Es geht nicht um das Paar, es geht um die Karte. Die operator [] wird zum Einfügen oder Aktualisieren von Elementen in einer Karte verwendet.

Zum Beispiel in einem std::map<char, int> myMap{{'a', 27}, {'b', 3}, {'c', 1}};, konnte ich folgende tun (wie oben verlinkten in der Seite gezeigt):

myMap['a'] = 6; //to change the value associated to 'a' 
myMap['d'] = 8; //to insert a new value 

ich auch Folgendes tun könnte:

In den 3 Linien
myMap['b'] += 9; //Now the value associated to b is 3 + 9 = 12 

Wenn der Code in der Frage geschrieben wird, werden die Werte aktualisiert, die mit den Zeichenfolgen innerhalb der Klammern verknüpft sind.

Die operator+= wurden wahrscheinlich für Paare mit Vorlage überladen. (Schauen Sie sich die Antworten auf diese question) Dies könnte sein, warum sind Sie diese Fehler statt der folgenden bekommen (ersetzen char mit string):

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>’) 

Da der gleiche Vorgang die gleichen Fehler nicht reproduzieren, Das Problem ist von tieferen Implementierungen, für die Sie keinen Kontext zur Verfügung gestellt haben. Sie könnten nach rechts und links Werten in Beziehung gesetzt werden:

cannot convert ‘targetLength’ (type ‘int’) to type ‘int&&’ 

Sie [könnten] [1] bei denen answers dafür suchen.

[1]: Könnte, weil ich nicht sicher bin, was ich sage. Ich wollte mit einem Kommentar beitragen, aber nicht genug Rep, also versuchte ich mein Bestes mit einer Antwort.

+0

Danke, die Antworten, die Sie verlinkt haben, sind sehr hilfreich. Die Abfrage wurde in Kommentaren beantwortet. Es war eine C++ 98 Sache, und ich kompilierte mit C++ 11. Es kompiliert erfolgreich nach. – jerin

Verwandte Themen