2017-05-08 1 views
2

라이브러리의 코드베이스를 읽는 동안 다음과 같이 나타났습니다.= 쌍으로 연산자 = 템플릿을 사용하여 make_pair

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 컴파일 오류 던지고 아래의 코드에 사용

errorMap

은,로서 정의된다. 자체 빌드 시스템을 통해 라이브러리를 실행할 때 코드가 컴파일되는 것 같습니다. 누군가 여기서 정확하게 일어나는 일에 대해 밝힐 수 있습니까?

추 신 : 이미 cppreference 및 다른 사이트에서 페어 설명서를 살펴 보았으나 페어에 += 연산자를 지정하지 않았습니다. 더 많은 정보를 찾을 수없는 템플릿 인수가있는 make_pair이 발생했습니다.

+0

아마도 그들 자신의 연산자 + =? – immibis

+0

의 + = 연산자에 과부하를 걸지 않는 한 가능성이 희박합니다. 그게 가능하니? – jerin

+1

'make_pair'가 완벽한 전달을 사용하기 때문에 오류가 발생했다고 생각합니다. 이는 형식을 추론 할 때만 작동합니다. 유형을 지정하면 r 값만 허용됩니다. 나는 왜 오류가 사라질 지 모른다. –

답변

1

쌍에 관한 것이 아니라지도에 관한 것입니다. operator []은 맵에 요소를 삽입하거나 업데이트하는 데 사용됩니다. 다음

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

나는 또한 할 수 : 3 개 라인에서

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

std::map<char, int> myMap{{'a', 27}, {'b', 3}, {'c', 1}}; 예를 들어

, 나는 (위의 링크 된 페이지에서 입증 된 바와 같이) 다음을 수행 할 수 질문에 게시 된 코드 중 괄호 안에있는 문자열과 관련된 값이 업데이트되고 있습니다.

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

관련 문제