Хорошо, давайте разберем рабочую версию:
int Analysis::getUnixTime() const { // (1)
// (2) --------v v----- (3)
return Travel::getTime().getTimeAsUnix();
}
При (1)
функция getUnixTime
определена для работы с постоянным экземпляром. Это означает, что вы можете вызывать только другие постоянные функции и не можете изменять никакие переменные-члены.
При (2)
вызывается Travel::getTime()
. Это вызов нестатической функции-члена , исключающей ее синтаксис. Но это нормально, это понятно и вызывает const
версию функции, которая возвращает const Time&
. Ссылка на постоянный объект Time
.
При (3)
функция-член getTimeAsUnix
вызывается для const Time&
. Это идеально, потому что Time
имеет функцию-член, названную таким образом, которая помечена для работы с постоянными объектами.
Таким образом, как вы видите, все объекты постоянны, и вы вызываете только постоянную функцию.
Что пошло не так, когда вы разбили код на две строки?
Давайте посмотрим на первую строку в теле вашей функции:
Time& t = Travel::getTime();
Как мы уже говорили, Travel::getTime()
вызывает нестатическую функцию-член . Поскольку this
является константным объектом (вы находитесь в функции const), то вызывается константная версия getTime
, как и раньше.
Тип возврата const getTime
равен * 1039. *.
Тогда вы делаете Time& t =
. Это где вы ошибка. const Time&
не может быть изменено. A Time&
можно изменить. Если вы ссылаетесь на постоянный объект с помощью изменяемой ссылки, то вы сможете изменить постоянный объект. Язык запрещает это!
Чтобы это исправить, просто используйте постоянные ссылки:
const Time& t = Travel::getTime();