You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:42:41