2011-04-19 7 views
1

최근에 문제가 발생했습니다.이를 방지하기 위해 볼 수있는 유일한 방법은 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

+0

내 C++ 지식이 좋지 않거나 변수 선언이 나에게 적합하지 않습니다. 키워드 "자동"은 무엇입니까? –

+3

"일부 const가 아닌 함수가 여전히 Nu의 내부를 수정해야하는 경우 _m"Nu는 맵 키로 사용할 수 없습니다. 수정되면지도가 더 이상 주문되지 않습니다. – Cubbi

+1

@Joris,'auto'는 C++ 0x의 새로운 기능입니다 - 아마도 일부 컴파일러가 이미 그것을 지원합니까? –

답변

-1

"찾기"귀하의 경우에 const_iterator를 반환합니다. 퍼팅 :

map<Nu*,float>::const_iterator it = _m.find(n); 

... 

return it->second; 

나는 생각합니다.

당신은 물론 당신의지도를 읽을 수있는 CONST 방법에 있기 때문에, mapNu* const을 기대하기 때문입니다 그것을

+0

불행하게도 이것은 컴파일되지 않을 것입니다 - 리턴 타입은 :: const_iterator로 정확하게 추론됩니다. 그러나 .find (n)은 const Nu *를 Nu *로 캐스트 할 수 없으므로 매개 변수와 일치하지 않습니다. –

+0

네가 맞다. 여기에 cpp 파일에 코드를 넣어두면 엉망이됩니다. –

0

을 수정/쓰기,하지만 당신은 그것을 const Nu*을 부여하지. 나는 또한 매우 비논리적 인 것을 발견하고 이유를 이해하지 못한다.하지만 이것이 그 방법이다.

관련 문제