Отбрасывает ошибку квалификаторов

Для моего classа compsci я реализую class шаблонов Stack, но столкнулся с нечетной ошибкой:

Stack.h: В функции-члена ‘ const T Stack::top() const [с T = int]’:

Stack.cpp: 10: ошибка: передача ‘ const Stack ‘ как ‘ this ‘ аргумент ‘ void Stack::checkElements() [with T = int]’ отбрасывает квалификаторы

Stack::top() выглядит следующим образом:

 const T top() const { checkElements(); return (const T)(first_->data); } 

Stack::checkElements() выглядит следующим образом:

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

Стек использует связанные узлы для хранения, поэтому first_ является указателем на первый узел.

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

checkElements() не помечена как const поэтому вы не можете ее вызывать на объектах со checkElements() const .

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

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

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

Вы вызываете метод non-const из метода const.

Поскольку checkElements () не объявляется const.

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

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

  • Как сравнить две метки времени в формате «Месяц Дата hh: mm: ss», чтобы проверить + ve или -ve значение
  • Создание равномерного распределения INTEGERS в C
  • Как прочитать полную строку от пользователя, используя cin?
  • Как создать пользовательский элемент управления WPF с содержимым NAMED
  • printf с «% d» чисел, начиная с 0 (ex «0102»), давая неожиданный ответ (например, «66»)
  • Как получить правильный IP-адрес из HTTP_X_FORWARDED_FOR, если он содержит несколько IP-адресов?
  • Максимальное количество символов, которое может отображать TextBox
  • Почему полезен указатель «точка-volatile», например «volatile int * p»?
  • Почему в C ++ не существует ссылки на член?
  • Установите глобальные горячие клавиши с помощью C #
  • WCF HttpTransport: stream с буферизацией TransferMode
  • Давайте будем гением компьютера.