Объекты в std::set
сохраняются как const StudentT
. Поэтому, когда вы пытаетесь вызвать getId()
с объектом const
, компилятор обнаруживает проблему, в основном вы вызываете функцию не-const-члена в const-объекте, которая не разрешена, поскольку не-константные функции-члены не делают НИКАКИХ ОБЯЗАТЕЛЬНО не изменить объект; поэтому компилятор должен сделать предположение safe , что getId()
может попытаться изменить объект, но в то же время он также замечает, что объект является const; поэтому любая попытка изменить объект const должна быть ошибкой. Следовательно, компилятор генерирует сообщение об ошибке.
Решение прост: сделайте функции const такими как:
int getId() const {
return id;
}
string getName() const {
return name;
}
Это необходимо, потому что теперь вы можете вызывать getId()
и getName()
для объектов const как:
void f(const StudentT & s)
{
cout << s.getId(); //now okay, but error with your versions
cout << s.getName(); //now okay, but error with your versions
}
В качестве побочного элемента вы должны реализовать operator<
как:
inline bool operator< (const StudentT & s1, const StudentT & s2)
{
return s1.getId() < s2.getId();
}
. Параметры примечаний теперь const
.