2010-03-04 9 views
9

Pour ma classe compsci, je suis en œuvre une classe de modèle de la pile, mais se sont heurtées à une erreur bizarre:Ignore erreur de qualification

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() ressemble à ceci:

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

Stack<T>::checkElements() ressemble à ceci :

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

La pile utilise noeuds liés pour le stockage, si first_ est un pointeur sur le premier noeud.

Pourquoi ai-je cette erreur?

Répondre

20

Votre fonction checkElements() est pas marqué comme const si vous ne pouvez pas l'appeler sur const objets qualifiés.

top(), mais est qualifié const donc dans top(), this est un pointeur sur un const Stack (même si l'instance Stack sur laquelle top() a été appelé se trouve être non const), de sorte que vous ne pouvez pas appeler checkElements() qui toujours requiert une instance non const.

13

Vous ne pouvez pas appeler une méthode non-const à partir d'une méthode const. Cela permettrait de «rejeter» le qualificatif const. Fondamentalement, cela signifie que si cela vous permettait d'appeler la méthode, cela pourrait changer l'objet, et cela romprait la promesse de ne pas modifier l'objet que le const offre à la fin de la signature de la méthode.

4

Vous appelez une méthode non-const à partir d'une méthode const.

2

Parce que checkElements() n'est pas déclaré const.

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

Sans cette déclaration, checkElements ne peut pas être appelé sur un objet const.