Объекты в 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
.
class A {
static const int masks[];
};
const int A::masks[] = { 1, 2, 3, 4, ... };
Возможно, вы уже захотите зафиксировать массив в определении класса, но это не обязательно. Массив будет иметь полный тип в момент определения (который должен находиться в файле .cpp, а не в заголовке), где он может определить размер из инициализатора.
// in the .h file
class A {
static int const masks[];
};
// in the .cpp file
int const A::masks[] = {0,1,3,5,7};
Вы можете сделать это:
class A {
static const int masks[];
};
const int A::masks[] = { 1, 2, 3, 4, .... };