Descarta el error calificador

Para mi clase de compsci, estoy implementando una clase de plantilla de stack, pero me he encontrado con un error extraño:

Stack.h: en la función miembro ‘ const T Stack::top() const [con T = int]’:

Stack.cpp: 10: error: pasar ‘ const Stack ‘ como ‘ this ‘ argumento de ‘ void Stack::checkElements() [con T = int]’ descarta los calificadores

Stack::top() tiene el siguiente aspecto:

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

Stack::checkElements() tiene este aspecto:

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

La stack utiliza nodos vinculados para el almacenamiento, por lo que first_ es un puntero al primer nodo.

¿Por qué recibo este error?

Su función checkElements() no está marcada como const por lo que no puede checkElements() en objetos const calificados.

top() , sin embargo está const así que en top() , this es un puntero a una Stack const (incluso si la instancia de Stack en la que se llamó a top() pasa a ser no const ), por lo que no se puede llamar a checkElements() que siempre requiere una instancia no const .

No puede llamar a un método no const desde un método const. Eso “descartaría” el calificador const .

Básicamente significa que si le permitiera llamar al método, podría cambiar el objeto, y eso rompería la promesa de no modificar el objeto que ofrece la const al final de la firma del método.

Estás llamando a un método sin const desde un método const.

Porque checkElements () no se declara const.

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

Sin esa statement, checkElements no puede invocarse en un objeto const.