1

第 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->records.at(block)中的向量,其中 block 是const char*

4

3 回答 3

2

我认为解决此问题和许多潜在其他问题的最简单方法是std::map<char*, ...>转入std::map<std::string, ...>.

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

于 2013-07-20T06:35:54.157 回答
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

于 2013-07-20T06:42:22.067 回答
0

因为您可以隐式地将较少限定符的变量分配给更多限定符但是您不能将更多限定符的变量隐式分配给较少限定符

例如

foo(char * p) foc(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* 块


或者


像这样抛弃 const

char* newblock = const_cast<char*>(block)//cast away const's ness 
*record_info_vector = this->records.at(newblock);
于 2013-07-20T10:44:55.960 回答