【发布时间】:2021-06-02 08:35:42
【问题描述】:
我很难在 C++ 中创建嵌套地图。
首先我已经定义了我的类型
typedef std::map<std::variant<int, std::string>, std::variant<int, long long int, std::string>> SimpleDict;
typedef std::map<std::variant<int, std::string>, std::variant<int, std::string,std::vector<SimpleDict>,SimpleDict>> ComplexDict;
然后我定义我的地图:
ComplexDict m = {
"MAC0", {
{"TAG0", "111001011000"},
{"SEQ", "110000100100"},
{"IOD", "0000"}
}
};
但是我得到No matching constructor for initialization of 'ComplexDic。即使为了简单起见,我将 m 的类型更改为 std::map< std::string, std::map<std::string, std::string> >,我也会得到相同的错误。我想我在语法上做错了。你能帮忙吗?
【问题讨论】:
-
"MAC0",是什么?也许您只是缺少一组大括号。在您的示例中,应该使用单个元素初始化地图? -
您缺少一对括号:godbolt.org/z/7nGaWPxWz(代表外部地图的单个元素)。
-
旁注:如果您尝试使用自己的 JSON 解析器,我建议使用现有库之一。这是一项相当艰巨的任务。
-
解释:
std::map内部以std::pair<key_type, value_type>s的形式存储其内容。如果你想初始化一个地图,你也需要提供这样的对:ComplexDict m = { std::pair<key_type, value_type>("MAC0", { /* your map */ }) };这个对不需要明确指定,你可以再次从统一初始化中受益——这是通过 additional pair 大括号,如前面的 cmets 所示。 -
无关,
std::variant不符合 C++11 甚至 C++14 的标准。它是在 C++17 中引入的,所以这篇文章的标签是有问题的。
标签: c++ dictionary c++11 stdmap