Ответ 1
Ваше желание не изменять t
выражается в const T& t
. Финал const
указывает, что вы не будете изменять какие-либо переменные-члены класса abs
. Поскольку нет класса, к которому принадлежит эта функция, вы получаете сообщение об ошибке
При записи следующей функции abs
я получаю сообщение об ошибке:
Функция нечлена unsigned int abs(const T&)
не может иметь cv-квалификатор.
template<typename T>
inline unsigned int abs(const T& t) const
{
return t>0?t:-t;
}
После удаления квалификатора const
для функции нет ошибки. Поскольку я не изменяю t
внутри функции, код должен быть скомпилирован. Мне интересно, почему я получил ошибку?
Ваше желание не изменять t
выражается в const T& t
. Финал const
указывает, что вы не будете изменять какие-либо переменные-члены класса abs
. Поскольку нет класса, к которому принадлежит эта функция, вы получаете сообщение об ошибке
Модификатор const
в конце объявления функции применяется к скрытому параметру this
для функций-членов.
Поскольку это свободная функция, нет this
и этот модификатор не нужен.
Параметр t
уже имеет свой собственный const
в списке параметров.
cv-qualifier в функции-члене указывает, что указатель this
должен иметь косвенный тип const
(или volatile
, const volatile
), и поэтому функция-член может быть вызвана экземплярами с этой квалификацией.
Свободные функции (и статические функции класса) не имеют указателя this
.
Как мы все знаем, ключевое слово const
используется после того, как список аргументов указывает, что это указатель на константу указателя.
Существует нечлена-функция, она не принадлежит классу, поэтому возникает ошибка const const end.
Решение проблемы: - либо стать функцией члена класса, либо удалить ключевое слово const
const end end