최근에 문제가 발생했습니다.이를 방지하기 위해 볼 수있는 유일한 방법은 const_cast를 사용하는 것입니다. 그러나이 방법을 사용하지 않으려면 다른 방법을 사용하지 않고이 문제를 피하는 방법이 있습니다. 코드의 기능을 변경합니다. 아래의 코드 조각은 내 문제를 아주 간단한 예제로 보여줍니다. 여기std :: map의 const_cast 문제
struct Nu
{
Nu() {v = rand();}
int v;
};
struct G
{
~G()
{
for(auto it = _m.begin(); it != _m.end(); it++) delete it->first;
}
void AddNewNu()
{
_m[new Nu] = 0.5f;
}
void ModifyAllNu()
{
for(auto it = _m.begin(); it != _m.end(); it++) it->first->v++;
}
float F(const Nu *n) const
{
auto it = _m.find(n);
// maybe do other stuff with it
return it->second;
}
map<Nu*, float> _m;
};
, 뉴 실제로 그 레이아웃 이미 외부 라이브러리 (따라서 "부동"와 일치 할 필요에 의해 고정되어 단순히 뉴로 접혀있을 수없는 매우 큰 구조체, 그리고 다른 여러 가지에 대한 가정 이유는 map<Nu, float>
일 수 없습니다). G 구조체에는 생성 된 모든 누수를 유지하는 데 사용되는 맵이 있습니다 (그리고 궁극적으로는 모두 파괴시 삭제됩니다). 작성된대로 함수 F는 컴파일되지 않습니다. std :: map에서 예상대로 (Nu n)을 (const Nu * n)을 캐스팅 할 수 없습니다. 그러나 맵을 map<const Nu*, float>
으로 전환 할 수 없습니다. 일부 const가 아닌 함수가 여전히 Nu의 내부 _m을 수정해야하기 때문입니다. 물론 다른 Nu을 추가로 std :: vector에 저장 한 다음지도 유형을 const로 전환 할 수 있습니다. 그러나이 방법은 완전히 불필요한 벡터를 도입합니다. 그래서 내가 생각한 유일한 대안은 F 함수 (안전한 const_cast 여야 함) 안에 const_cast를 사용하는 것입니다. 이것이 피할 수 있는지 궁금합니다.
좀 더 사냥 후이 동일한 문제는 여기에 이미 해결되었습니다 Calling map::find with a const argument
내 C++ 지식이 좋지 않거나 변수 선언이 나에게 적합하지 않습니다. 키워드 "자동"은 무엇입니까? –
"일부 const가 아닌 함수가 여전히 Nu의 내부를 수정해야하는 경우 _m"Nu는 맵 키로 사용할 수 없습니다. 수정되면지도가 더 이상 주문되지 않습니다. – Cubbi
@Joris,'auto'는 C++ 0x의 새로운 기능입니다 - 아마도 일부 컴파일러가 이미 그것을 지원합니까? –