C++接收map参数的转换构造函数初始化类对象报错如何解决
问题原因&解决方案
核心错误1:键值对顺序不匹配
你定义的构造函数接收的是std::map<int, std::string>类型参数,该容器的单条元素为std::pair<int, std::string>,要求学号(int)在前,姓名(string)在后。但你编写的初始化列表是{"Ihsan", 2}、{"student x", 2},刚好把姓名和学号的顺序写反了,类型无法匹配,所以编译器找不到对应的构造函数。
快速修复方案
仅需调整初始化时的参数顺序,把学号放前面、姓名放后面即可正常编译运行,修改main函数中的初始化代码:
int main() { // 调整为 {学号, 姓名} 的顺序,外层大括号对应std::map的初始化列表 Class_Room class8C = {{2, "Ihsan"}}; std::cout << class8C; }
运行后输出结果为:
2 => Ihsan, NIL
优化方案:适配你期望的初始化写法
如果你不想调整顺序,就想按照{"姓名", 学号}的方式初始化,可以给Class_Room新增一个接收初始化列表的构造函数,无需额外构造std::map,使用更直观:
// 在Class_Room的public区域新增如下构造函数 Class_Room(std::initializer_list<std::pair<std::string, int>> list) { for (const auto& item : list) { // item.second是学号,item.first是姓名 student_data[item.second] = {item.first, "NIL"}; } }
添加后你最开始写的初始化代码Class_Room class8C = {{"student x", 2}, {"student y", 3}};就可以直接正常运行。
额外代码优化建议
你类中定义的私有成员std::vector<std::string> data没有必要作为类成员,每次调用new_student时都会清空重写,直接把它改成new_student函数内的局部变量即可,避免后续多操作时出现成员变量被意外篡改的隐患。
内容的提问来源于stack exchange,提问作者ihsan
相关产品推荐
相关产品推荐

