C++向STL multimap插入struct类型值编译报错如何解决?
问题原因
- 错误1(直接对应编译报错):
typedef std::multimap<int,struct temp> mapobj;是给std::multimap<int, temp>类型定义了别名叫mapobj,它本身是类型标识符不是实例对象,不能直接对类型调用成员方法insert,所以编译器看到mapobj.insert会直接报错,需要先声明该类型的实例对象再调用方法。 - 错误2:插入时构造键值对的语法错误,正确构造
std::pair<int, temp>类型键值对的方式可以用std::make_pair(key, t),或者显式构造std::pair<int, temp>(key, t),你写的pair<int,struct>key,t既缺少命名空间前缀、类型参数不完整,也没有用括号包裹构造参数,语法完全不合法。
正确实现代码
#include <stdio.h> #include <map> #include <utility> // make_pair依赖的头文件,部分编译器下map会自动引入,建议显式包含 struct temp { int x; int id; }; int main() { temp t; int key; // 定义multimap类型别名 typedef std::multimap<int, temp> mapobj; // 声明multimap实例对象 mapobj m; t.x = 10; t.id = 20; key = 1; // 插入方式1:make_pair构造键值对,兼容所有C++版本 m.insert(std::make_pair(key, t)); // 插入方式2:C++11及以上版本支持的花括号初始化,写法更简洁 // m.insert({key, t}); // 插入方式3:C++11及以上版本支持的emplace,直接在容器内构造对象性能更高 // m.emplace(key, t); // 遍历验证插入结果 for (const auto& item : m) { printf("key: %d, x: %d, id: %d\n", item.first, item.second.x, item.second.id); } return 0; }
补充说明
自定义struct作为multimap的value存储时,不需要额外重载比较运算符,因为multimap的排序规则仅作用于key,value只要满足可复制/可移动的要求即可,你定义的temp结构体默认符合要求,不需要额外修改。
内容的提问来源于stack exchange,提问作者Ganesh Sha
相关产品推荐
相关产品推荐

