2013-07-20 1 views
1

29 행은 컴파일에 질식 :C++ const를 혼란

void 
CI_Metadata::get_record_metadata(const char* block, RecordInfoVector* record_info_vector) { 
    *record_info_vector = this->records.at(block); // <== LINE 29 
    return; 
} 

오류 :

CI_Metadata.cpp: In member function ‘void CI_Metadata::get_record_metadata(const char*, RecordInfoVector*)’: 
CI_Metadata.cpp:29: error: invalid conversion from ‘const char*’ to ‘char*’ 
CI_Metadata.cpp:29: error: initializing argument 1 of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::at(const _Key&) [with _Key = char*, _Tp = std::vector<std::pair<char*, bool>, std::allocator<std::pair<char*, bool> > >, _Compare = std::less<char*>, _Alloc = std::allocator<std::pair<char* const, std::vector<std::pair<char*, bool>, std::allocator<std::pair<char*, bool> > > > >]’ 

나는이()에서 *는 const를 숯을하지 않음을 의미 가정합니다. 그렇다면 어떻게하면 에 저장된 벡터에 액세스합니까?> records.at (블록) 여기서 블록은 const char *입니까?

답변

0

:

는 다른 방법으로, 적절한 비교를 정의합니다.

at() 함수를 제어 할 수는 없지만 get_record_metadata 프로토 타입을 제어한다고 가정하면 더 이상 const로 선언되지 않게 매개 변수를 변경할 수 있습니다. 당신이 get_record_metadata 유일한 대안으로 CONST 문자 *를 통과해야하는 경우

void 
CI_Metadata::get_record_metadata(char* block, RecordInfoVector* record_info_vector) { 

는 CONST 아닌 다른 문자의 *에 데이터를 복사하는 것입니다. http://en.cppreference.com/w/cpp/string/byte/strcpy

+2

같이 const를 멀리 캐스팅. get_record_metadata()의 작성자는 char * 이상의 것을 고려할 수 없다. 그의 코드는 아직 준비가되지 않았으므로 대략 근사치를 작성하고 있습니다. 분명히 API를 준수해야합니다. (그러나 이것은 std :: string을 사용하기 시작한 또 다른 인수가 될 것입니다. char \ *가 현대 std :: world에서 그런 제 2 종 시민이 될지 전혀 몰랐습니다.) – Chap

2

이 문제와 잠재적 인 다른 문제를 해결하는 가장 쉬운 방법은 std::map<char*, ...>std::map<std::string, ...>으로 튜링하는 것입니다. 당신이, 상기() 함수를 변경 NPE의 답변을 읽을 수있는 경우 Using char* as a key in std::map

0

당신이 imlicitly 더 한정자 적은 규정의 변수를 할당 할 수 있습니다하지만 당신은 암시 적으로 (예를

foo는 (숯불 * p를) fooc 덜 예선

에 더 많은 규정의 변수를 지정 질수 있기 때문에 CONST의 char * p를) 귀하의 경우에는

int main(int argc, char agrv[]) { 
const char* cp = "hello"; 
char* p = new char[10]; 
foo(cp); // ==> compilation error 
strcpy(p, cp); 
fooc(p) // No probs assigning to a more qualified var 
} 

중 하나는 char const를 숯불 * 블록을 변환 * 차단


또는

은 \ * const를 문자 전달 및 문자 * 내가해야합니다 *, 불행하게도이

char* newblock = const_cast<char*>(block)//cast away const's ness 
*record_info_vector = this->records.at(newblock);