C++中从std::unordered_map返回student结构体时类型绑定错误的修复方法
解决std::unordered_map访问时的引用绑定错误
我来帮你梳理下问题所在,以及怎么修复。
首先看你遇到的错误:non-const lvalue reference to type data::student cannot bind to a value of unrelated type std::unordered_map<int8_t, data::student>,核心原因是你把指针当成了容器本身来用。
在main函数里,students是std::unordered_map<int8_t, data::student>*类型的指针,而students[1]的意思是“取指针数组中索引为1的那个unordered_map对象”,这显然不是你想要的——你想访问的是指针指向的那个map里key为1的元素。
另外还有一个隐藏问题:你的addnew函数里,所有需要修改的参数(ID、keys、students)都是传值的,这意味着你在函数里修改的只是这些变量的副本,main函数里的原对象根本不会被更新,就算你解决了第一个错误,map里也不会有任何数据。
修复步骤
1. 修正map的访问方式
把data::student &ben = students[1];改成以下两种方式之一:
- 先解引用指针,再用
[]:data::student &ben = (*students)[1]; - 使用指针的成员访问运算符
->调用at()(推荐,因为at()会检查key是否存在,避免意外插入默认对象):data::student &ben = students->at(1);
2. 修改addnew函数的参数为引用
把addnew的参数改成引用类型,这样函数里的修改会直接作用到main里的原对象:
void addnew(int& ID, std::vector<int8_t>& keys, std::unordered_map<int8_t, data::student>& students, std::string m_name, std::string m_surname, uint8_t m_age, uint8_t m_year) { ID += 1; keys.push_back(ID); students[ID] = makestudent(m_name,m_surname,m_age,m_year); }
注意这里ID、keys、students都加了&,表示传引用而非传值。
3. (可选但推荐)避免不必要的动态分配
你现在用new创建了ID、keys、students的动态对象,其实完全可以用栈变量,更安全也更简洁,还不用手动管理内存:
int main() { int ID = 0; std::vector<int8_t> keys; std::unordered_map<int8_t, data::student> students; data::addnew(ID, keys, students, "name", "surname", 1, 1); data::addnew(ID, keys, students, "name2", "surname2", 2, 2); // 使用at()访问,确保key存在 data::student &ben = students.at(1); std::cout << ben.age << std::endl; return EXIT_SUCCESS; }
完整修改后的代码
Preambule.h
#include <string> #include <unordered_map> #include <vector> namespace data { struct student { std::string name; std::string surname; uint8_t age; uint8_t year; }; student makestudent(std::string m_name, std::string m_surname, uint8_t m_age, uint8_t m_year) { student s = {m_name, m_surname, m_age, m_year}; return s; }; // 修改参数为引用 void addnew(int& ID, std::vector<int8_t>& keys, std::unordered_map<int8_t, data::student>& students, std::string m_name, std::string m_surname, uint8_t m_age, uint8_t m_year) { ID += 1; keys.push_back(ID); students[ID] = makestudent(m_name,m_surname,m_age,m_year); } }
main.cpp
#include <string> #include <iostream> #include <unordered_map> #include "preambule.h" int main() { // 使用栈变量替代动态分配 int ID = 0; std::vector<int8_t> keys; std::unordered_map<int8_t, data::student> students; data::addnew(ID, keys, students, "name", "surname", 1, 1); data::addnew(ID, keys, students, "Alice", "Smith", 20, 3); // 正确访问map中的元素 data::student &ben = students.at(1); std::cout << ben.age << std::endl; // 输出1 data::student &alice = students.at(2); std::cout << alice.name << std::endl; // 输出Alice return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者AlmostAnEngineer
相关产品推荐
相关产品推荐

