我正在尝试将一个类对象添加到地图中,这就是我所拥有的:
#include<vector>
#include<map>
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
class Student{
int PID;
string name;
int academicYear;
public:
Student(int, string, int);
};
Student::Student (int P, string n, int a) {
PID = P;
name = n;
academicYear = a;
}
void createStudent(map<string, Student>);
int main(int argc, char** argv){
map <string, Student> studentList;
createStudent(studentList);
}
void createStudent(map<string, Student> studentList){
int PID;
string name;
int academicYear;
cout << "Add new student-\nName: ";
getline(cin, name);
cout << "PID: ";
cin >> PID;
cout << "Academic year: ";
cin >> academicYear;
Student newstud (PID, name, academicYear);
studentList[name] = newstud; //this line causes the error:
//no matching function for call to
//'Student::Student()'
}
我不明白为什么在那里调用构造函数,我认为newstud已经从前一行构建了。当我尝试将newstud添加到地图时,有人能解释发生了什么吗?
答案 0 :(得分:2)
std::map::operator[]
将使用默认构造函数将新元素插入到容器中,如果它不存在,在您的情况下不存在,即使您提供了构造函数也可能没有意义。
因此请使用std::map::insert
来处理此类情况
即使您使用studentList.insert(std::make_pair(name, newstud));
成功插入,它也不会反映studentList
中原始地图main ( )
的更改,除非您使用参考类型,在函数定义&amp;声明createStudent
所以使用
void createStudent(map<string, Student>& );
答案 1 :(得分:1)
要使用此功能添加条目,您应该通过引用传递参数studentList
。
而不是
studentList[name] = newstud;
使用:
studentList.insert(std::make_pair(name, newstud));
只是一个建议。