2013-07-20 118 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> > > > >]’ 

我假定這意味着在()不會拿常量字符*。那麼,如何訪問存儲在this-> records.at(block)中的矢量,其中block是const char *

回答

0

如果你可以改變在()函數,閱讀NPE的答案。

假設您沒有對at()函數的控制權,但是確實擁有對get_record_metadata原型的控制權,您可以將參數更改爲不再聲明爲const。

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

如果必須通過一個const char *到get_record_metadata你唯一的選擇是將數據複製到另一個字符*這不是一個常量。 http://en.cppreference.com/w/cpp/string/byte/strcpy

+2

不幸的是,我*必須*通過爲const char \ *。 get_record_metadata()的作者不能或不會超越char *。他的代碼還沒有準備好,所以我寫了一個粗略的近似值,顯然必須符合API。 (但是,這將成爲他開始使用std :: string的另一個參數 - 我不知道char \ *在現代std :: world中是如此二等公民。) – Chap

2

我認爲解決這個問題和一系列潛在的其他問題的最簡單方法是將std::map<char*, ...>轉換爲std::map<std::string, ...>

另外,確定一個合適的比較:Using char* as a key in std::map

0

因爲你可以少預選賽的變量imlicitly分配給更多的預選賽,但你不能更多預選賽的變量隱式分配給少預選賽

例如

富(字符* 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 
} 

在你的情況下,或者轉換爲const char *塊爲char *阻止



丟掉常量這樣

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