2010-03-04 9 views
9

para mi clase CompSci, yo estoy poniendo en práctica una clase de plantilla de pila, pero se han encontrado con un error extraño:Descarta los calificadores de error

Stack.h: In member function ‘ const T Stack<T>::top() const [with T = int]’:

Stack.cpp:10: error: passing ‘ const Stack<int> ’ as ‘ this ’ argument of ‘ void Stack<T>::checkElements() [with T = int]’ discards qualifiers

Stack<T>::top() se parece a esto:

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

Stack<T>::checkElements() tiene este aspecto :

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

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

¿Por qué me sale este error?

Respuesta

20

La función checkElements() no está marcada como const por lo que no puede llamarla a los objetos calificados const.

top(), sin embargo es const cualificado por lo que en top(), this es un puntero a una constante Stack (incluso si la instancia Stack en el que se llamaba top() pasa a ser no const), por lo que no se puede llamar checkElements() cuales siempre requiere una instancia que no sea const.

13

No se puede llamar a un método no const desde un método const. Eso sería 'descartar' el const calificador.

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 el const al final de la firma del método.

4

Está llamando a un método no const desde un método const.

2

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 declaración, checkElements no puede invocarse en un objeto const.

Cuestiones relacionadas