2010-03-04 65 views
9

對於我compsci類,我實現一個Stack模板類,但遇到了一個奇怪的錯誤:丟棄預選賽錯誤

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()看起來是這樣的:

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

Stack<T>::checkElements()看起來是這樣的:

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

堆棧使用用於存儲鏈接的節點,所以first_是指向第一個節點的指針。

爲什麼我會收到此錯誤?

回答

20

您的checkElements()函數未標記爲const因此您無法在const合格對象上調用它。

top(),不過是const修飾所以在top()this是一個指向一個const Stack(即使Stack實例上top()被稱爲恰好是非const),所以你不能把它checkElements()總是需要非const實例。

13

您不能從const方法調用非const方法。這會'丟棄'限定符。

基本上這意味着如果它允許你調用該方法,那麼它可以改變對象,並且這將破壞不修改方法簽名結尾處const提供的對象的承諾。

4

您正在從const方法調用非const方法。

2

因爲checkElements()沒有聲明爲const。

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

沒有該聲明,checkElements無法在const對象上調用。