Для моего compsci класса я реализую шаблонный класс Стека, но столкнулся с нечетной ошибкой:
Stack.h: В функции членства‘
const T Stack<T>::top() const
[с T = интервал]’:Стек cpp:10: ошибка: передача‘
const Stack<int>
'как'this
’аргумент‘void Stack<T>::checkElements()
[с T = интервал]’ отбрасывает спецификаторы
Stack<T>::top()
похож на это:
const T top() const {
checkElements();
return (const T)(first_->data);
}
Stack<T>::checkElements()
похож на это:
void checkElements() {
if (first_==NULL || size_==0)
throw range_error("There are no elements in the stack.");
}
Стек использует связанные узлы для устройства хранения данных, таким образом, first_
указатель на первый узел.
Почему я получаю эту ошибку?
Ваша функция checkElements()
не помечена как const
, поэтому вы не можете вызвать ее на const
квалифицированных объектах.
top()
, однако, квалифицирована как const, поэтому в top()
, this
является указателем на const Stack
(даже если экземпляр Stack
, на котором была вызвана top()
, оказывается не const
), поэтому вы не можете вызвать checkElements()
, который всегда требует неconst
экземпляр.
Вы не можете вызвать неконст-метод из const-метода. Это "отбросит" квалификатор const.
По сути это означает, что если бы он позволил вам вызвать метод, то он мог бы изменить объект, а это нарушило бы обещание не изменять объект, которое дает const
в конце сигнатуры метода.
Потому что checkElements () не объявлен как const.
void checkElements() const {
if (first_==NULL || size_==0)
throw range_error("There are no elements in the stack.");
}
Без этого объявления checkElements нельзя вызвать для константного объекта.