如何在 C++ 中使用 Google Protobuf 映射?

How to use Google Protobuf Map in C++?

我正尝试在 C++ 中使用新的 protobuf Map 功能。

以下是在 Ubuntu 14.04 上使用 gcc 4.9.2 C++14 和 protobuf 3.0.0-alpha-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;

使用 [] 语法访问地图对于 std::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::Map很清楚,这应该是一个基本的手术。

你知道这里出了什么问题吗?我欢迎任何使用新 protobuf 映射的示例,因为我在网上搜索了几个小时后还没有找到任何示例。

正如 Pixelchemist 指出的那样,问题在于 map 是一个指针,因此 [] 运算符不起作用。

因此,需要先取消引用指针。 *map[key] 也不起作用,因为编译器首先解析 [],然后解析 *。以下确实有效:

(*map)[key] = val;

尽管这是一个非常基本的问题,但这对 C++ 和 Protocol Buffers 来说是一个很好的学习机会。