2015-06-03 3 views
2

Я пытаюсь использовать новую функциональность карты protobuf в C++.Как использовать Google Protobuf Map в C++?

Следующая было сделано на Ubuntu 14.04 с GCC 4.9.2 C++ 14 и Protobuf 3.0.0-альфа-4:

определение Сообщение:

message TestMap { 
    map<string,uint64> map1 = 1; 
} 

Затем я попытался скомпилировать следующий пример программы:

auto test = debug::TestMap::default_instance(); 
auto map = test.mutable_map1(); 
string key = "key"; 
uint64 val = 20; 
map[key] = val; 

Acccessing карту, используя синтаксис [] работает совершенно нормально для станд :: unordered_map. Но реализация Protobuf всегда дает следующее сообщение об ошибке компилятора:

error: no match for ‘operator[]’ (operand types are ‘google::protobuf::Map<std::basic_string<char>, long unsigned int>*’ and ‘std::string {aka std::basic_string<char>}’) 

Я не понимаю, почему этот оператор не известен, так как файл заголовка Google :: Protobuf :: Карта явно найдено, и это должно быть элементарная операция.

Вы знаете что-то не так? Я бы приветствовал любой пример использования новых карт protobuf, так как я не нашел ни одного онлайн после исследования в течение нескольких часов.

+3

Ваша переменная 'map', кажется, указатель. Вы попробовали '* map [key]'? – Pixelchemist

+0

@Pixelchemist: Вы правы, спасибо, что указали это. '* map [key]' не работает, но '* (map) [key]' делает. Довольно простой! Я все время смотрел в неправильном направлении. –

+0

@Pixelchemist: Вы хотите опубликовать ответ или мне это нужно? –

ответ

5

Как Pixelchemist отметил, что проблема в том, что map является указателем, так что оператор [] не работает.

Таким образом, указатель должен быть разыменован первым. *map[key] также не работает, так как компилятор сначала анализирует [], а затем *. Работает:

(*map)[key] = val; 

Хотя это довольно простая проблема, это хорошая возможность обучения для C++ и протокольных буферов.

+3

FWIW, вы могли бы сделать: 'auto & map = * test.mutable_map1();', а затем 'map [key]' будет работать. –

+0

Спасибо Kenton! Это намного более удобно и удобнее в обслуживании. –

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