2009-03-26 8 views
14

const로 STL 맵에 대한 참조를 전달하면 [] 연산자가 중단되는 이유가 있습니까? 여기 C++ const std :: map reference가 컴파일되지 않습니다.

error: no match for ‘operator[]’ in ‘map[name]’

함수의 프로토 타입입니다 : 내가 const를 사용할 때 나는이 컴파일러 오류 (GCC 4.2)을 얻을 나는 내가 const를 제거 할 때 아무 문제가 없음을 언급해야한다,

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map); 

std :: map 앞에 키워드가 있습니다.

정확하게 지시를 받았다면 [] 연산자는 키를 찾지 못하면 실제로지도에 새 쌍을 삽입합니다. 물론 이것이 왜 발생하는지 설명 할 수는 있지만 상상할 수는 없습니다. 이것은 이제까지 받아 들일만한 행동 일 것이다.

더 나은 방법이 있다면 을 사용하는 것과 같이 [] 대신을 찾으십시오. 감사하게 생각합니다. 나는 어느 쪽이든 작동하도록 찾을 수없는 것 같습니다 ... const 이터레이터 오류가 일치하지 않습니다.

감사합니다.

답변

26

operator[]을 사용할 수 없습니다. find를 사용하지만 const_iterator 대신 iterator 반환주의 :

std::map<std::string, std::string>::const_iterator it; 
it = map.find(name); 
if(it != map.end()) { 
    std::string const& data = it->second; 
    // ... 
} 

그것은 포인터와 같다. int*int const*을 할당 할 수 없습니다. 마찬가지로 const_iteratoriterator에 할당 할 수 없습니다. 당신의 "CONST 일치하지 않는 반복자 오류"를

6

연산자 []를 사용하는 경우 std :: map은 지정된 키가있는 항목을 찾습니다. 발견되지 않으면 생성합니다. 따라서 const의 문제점.

find 메소드를 사용하면 문제가 없습니다.

find()를 사용하려는 방법에 대한 코드를 게시 할 수 있습니까? 올바른 방법은 다음과 같습니다 더 CONST 연산자 [] 표준 : 맵이없는

if(map.find(name) != map.end()) 
{ 
    //... 
} 
2

아마 때문이다. operator []는 찾지 못한 요소를 추가합니다. 따라서 추가 가능성없이 검색하려는 경우 find() 메서드를 사용하십시오.

2

:

발견은()이 과부하가 있습니다

 iterator find (const key_type& x); 
const_iterator find (const key_type& x) const; 

추측은 당신이 좋아하는 일을하고 있기 때문에이 오류가있는 것입니다 const지도에서 find() 호출의 결과로 (왼쪽)는 const가 아닌 반복자를 할당 :

iterator<...> myIter /* non-const */ = myConstMap.find(...) 

그러면 오류가 발생할 수 있습니다. 실제로보고있는 오류는 아닙니다.

3

C++ 11을 사용하는 경우 std::map::at을 사용해야합니다.

이유가 std::map::operator[]인데 작동하지 않는 이유는지도에없는 키를 찾으면 제공된 키를 사용하여 새 요소를 삽입하고 그에 대한 참조를 반환하기 때문입니다 (링크 참조). 자세한 내용은 이것은 const std :: map에서는 불가능합니다.

그러나 'at'메서드는 키가 존재하지 않으면 예외를 throw합니다. 즉, 'at'메서드를 사용하여 요소에 액세스하기 전에 std :: map :: find 메서드를 사용하여 키의 존재를 확인하는 것이 좋습니다.