C++ const std::map 참조가 컴파일되지 않습니다.
-
22-08-2019 - |
문제
참조를 전달하는 이유가 있습니까? std::map
const로 인해 [] 연산자가 중단됩니까?const를 사용할 때 다음 컴파일러 오류(gcc 4.2)가 발생합니다.
오류:'map [name]'에서 'operator []'와 일치하지 않습니다.
함수 프로토타입은 다음과 같습니다.
void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);
그리고, 제거해도 문제가 없다는 점을 말씀드리고 싶습니다. const
앞에 키워드 std::map
.
올바르게 지시를 받았다면 [] 연산자는 키를 찾지 못한 경우 실제로 맵에 새 쌍을 삽입합니다. 이는 물론 이런 일이 발생하는 이유를 설명하지만 이것이 가능할 것이라고는 상상할 수 없습니다. 받아들일 수 있는 행동.
다음과 같은 더 좋은 방법이 있다면 찾다 [] 대신에 사용해 주시면 감사하겠습니다.그래도 직장을 찾을 수없는 것 같습니다 ...나는 받는다 const 일치하지 않는 반복자 오류.
해결책
예, 사용할 수 없습니다 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 const*
에게 int*
. 마찬가지로, 당신은 할당 할 수 없습니다 const_iterator
에게 iterator
.
다른 팁
Operator []를 사용하는 경우 std :: map은 주어진 키가있는 항목을 찾습니다. 그것이 찾지 못하면 그것을 만듭니다. 따라서 Const의 문제.
찾기 방법을 사용하면 괜찮을 것입니다.
find ()를 사용하는 방법에 대한 코드를 게시 해 주시겠습니까? 올바른 방법은 다음과 같습니다.
if( map.find(name) != map.end() )
{
//...
}
C++11을 사용하는 경우, 표준::지도::at 당신을 위해 일해야합니다.
이유 표준::맵::연산자[] 작동하지 않는 것은 찾고 있는 키가 맵에 없는 경우 제공된 키를 사용하여 새 요소를 삽입하고 이에 대한 참조를 반환한다는 것입니다(자세한 내용은 링크 참조).const std::map에서는 불가능합니다.
그러나 'at' 메소드는 키가 존재하지 않는 경우 예외를 발생시킵니다.즉, 'at' 메소드를 사용하여 요소에 액세스를 시도하기 전에 std::map::find 메소드를 사용하여 키의 존재를 확인하는 것이 아마도 좋은 생각일 것입니다.
아마도 std ::지도에 const 연산자가 없기 때문일 것입니다. 연산자 []는 찾을 수없는 경우 원하는 요소를 추가합니다. 따라서 추가 가능성없이 검색하려면 find () 메소드를 사용하십시오.
"const 불일치 반복 오류"의 경우 :
찾기 ()에는 두 개의 과부하가 있습니다.
iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;
나의 추측 이 오류가 발생하는 것입니다. find()
a에 전화하십시오 const
지도:
iterator<...> myIter /* non-const */ = myConstMap.find(...)
아마도 당신이보고있는 것은 아니지만 오류가 발생할 수 있습니다.