如何在 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 来说是一个很好的学习机会。
我正尝试在 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 来说是一个很好的学习机会。