C ++ const混淆

时间:2013-07-20 06:29:34

标签: c++ map key const

第29行在编译中窒息:

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> > > > >]’

我认为这意味着at()不会采用 const char *。那么,我如何访问存储在 this-&gt; records.at(block)中的向量,其中block是 const char *

3 个答案:

答案 0 :(得分:2)

我认为解决此问题的最简单方法以及一系列潜在的其他问题是将std::map<char*, ...>移植到std::map<std::string, ...>

或者,定义合适的比较器:Using char* as a key in std::map

答案 1 :(得分:0)

如果你可以改变at()函数,请阅读NPE的答案。

假设您无法控制at()函数,但可以控制get_record_metadata原型,只需将参数更改为不再声明为const。

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

如果你必须将一个const char *传递给get_record_metadata,你唯一的选择就是将数据复制到另一个不是const的char *中。 http://en.cppreference.com/w/cpp/string/byte/strcpy

答案 2 :(得分:0)

因为你可以将一个较少限定符的变量分配给更多的限定符但你不能隐式地将一个MORE限定符的变量赋值给较少的限定符

例如

foo(char * 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 * block转换为char * block



像这样抛弃const

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