2010-03-04 12 views
9

Für meine compsci Klasse, ich bin ein Stapel Template-Klasse Implementierung, sondern in eine ungerade Fehler ausgeführt:Verwirft Qualifikations Fehler

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() wie folgt aussieht:

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

Stack<T>::checkElements() wie folgt aussieht :

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

Der Stapel verwendet verknüpfte Knoten für den Speicher, also first_ ist ein Zeiger auf den ersten Knoten.

Warum erhalte ich diesen Fehler?

Antwort

20

Ihre checkElements() Funktion ist nicht als const markiert, so dass Sie sie nicht auf const qualifizierte Objekte aufrufen können.

top() ist jedoch const qualifiziert so in top(), this ein Zeiger auf einen const ist Stack (auch wenn die Stack Instanz, auf der top() genannt wurde geschieht nicht const sein), so dass Sie nicht checkElements() die nennen immer erfordert eine nicht const Instanz.

13

Sie können eine nicht konstante Methode nicht aus einer Konst-Methode aufrufen. Das würde den Const Qualifier "verwerfen".

Im Grunde bedeutet es, dass, wenn es erlaubt Ihnen, die Methode zu nennen, dann könnte es das Objekt zu ändern, und das würde bricht das Versprechen nicht das Objekt geändert wird, wie die const am Ende des Verfahrens Signatur bietet.

4

Sie rufen eine nichtkonstante Methode aus einer const-Methode auf.

2

Da checkElements() nicht deklariert ist const.

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

Ohne diese Deklaration kann checkElements nicht für ein konstantes Objekt aufgerufen werden.

Verwandte Themen