Ошибка спецификаторов отбрасываний

Для моего 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_ указатель на первый узел.

Почему я получаю эту ошибку?

10
задан Austin Hyde 4 March 2010 в 21:26
поделиться

4 ответа

Ваша функция checkElements() не помечена как const, поэтому вы не можете вызвать ее на const квалифицированных объектах.

top(), однако, квалифицирована как const, поэтому в top(), this является указателем на const Stack (даже если экземпляр Stack, на котором была вызвана top(), оказывается не const), поэтому вы не можете вызвать checkElements(), который всегда требует неconst экземпляр.

21
ответ дан 3 December 2019 в 13:51
поделиться

Вы не можете вызвать неконст-метод из const-метода. Это "отбросит" квалификатор const.

По сути это означает, что если бы он позволил вам вызвать метод, то он мог бы изменить объект, а это нарушило бы обещание не изменять объект, которое дает const в конце сигнатуры метода.

13
ответ дан 3 December 2019 в 13:51
поделиться

Потому что checkElements () не объявлен как const.

void checkElements() const {
    if (first_==NULL || size_==0)
        throw range_error("There are no elements in the stack.");
}

Без этого объявления checkElements нельзя вызвать для константного объекта.

2
ответ дан 3 December 2019 в 13:51
поделиться

Вы вызываете неконст-метод из const-метода.

4
ответ дан 3 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: