2015-04-17 5 views
0

Это немного моего кода:Ошибка: не жизнеспособны перегруженный оператор []

#include "pugi/pugixml.hpp" 

#include <iostream> 
#include <string> 
#include <map> 
int main() { 
    pugi::xml_document doca, docb; 
    std::map<std::string, pugi::xml_node> mapa, mapb; 

    if (!doca.load_file("a.xml") || !docb.load_file("b.xml")) 
     return 1; 

    for (auto& node: doca.child("site_entries").children("entry")) { 
     const char* id = node.child_value("id"); 
     mapa[new std::string(id, strlen(id))] = node; 
    } 

    for (auto& node: docb.child("site_entries").children("entry")) 
     const char* idcs = node.child_value("id"); 
     std::string id = new std::string(idcs, strlen(idcs)); 
     if (!mapa.erase(id)) { 
      mapb[id] = node; 
     } 
    } 

При компиляции я получаю эту ошибку:

src/main.cpp:16:13: error: no viable overloaded operator[] for type 'std::map<std::string, pugi::xml_node>' 
     mapa[new std::string(id, strlen(id))] = node; 
+3

'new std :: string ...' -> 'std :: string' –

+3

Вы мужчина java? Потому что я чувствую Java здесь: 'std :: string id = new std :: string (idcs, strlen (idcs));'. Вы не являетесь «новыми» локальными переменными в C++. – Lol4t0

+3

В настоящее время вы не 'new' * anything * в C++. – chris

ответ

5

У вас есть несоответствие типов. mapa имеет тип:

std::map<std::string, pugi::xml_node> mapa, 
     ^^^^^^^^^^^^ 

Но вы делаете:

mapa[new std::string(id, strlen(id))] = node; 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     string* 

std::map имеет два перегруженных operator[]:

T& operator[](const Key&); 
T& operator[](Key&&); 

В вашем случае, Key является std::string. Но вы пытаетесь перейти в std::string*, для которого нет конвертации в std::string - следовательно, вы получите сообщение об ошибке «нет жизнеспособных перегруженных operator[]».

Что ты хотел сделать, это:

mapa[id] = node; 

же комментарий к этой линии:

std::string id = new std::string(idcs, strlen(idcs)); 

C++ не является Java, вы просто делаете:

std::string id(idcs, strlen(idcs)); 

или просто:

std::string id = idcs; 
+0

Спасибо вам большое. Кажется, что эти ошибки отмечены такими ошибками: '' 'src/main.cpp: 21: 24: ошибка: использование незаявленного идентификатора idcs std :: string id (idcs, strlen (idcs)); ^ src/main.cpp: 23: 24: ошибка: использование незаявленного идентификатора 'node' mapb [id] = node; «Это связано с новым кодом или является отдельной проблемой? – Jimmy

+1

@Jimmy Вы объявляете это на линии раньше ('const char * idcs = node.child_value (" id ");')? – Barry

Смежные вопросы