Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Discards qualifiers error

Tags:

c++

For my compsci class, I am implementing a Stack template class, but have run into an odd 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() looks like this:

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

Stack<T>::checkElements() looks like this:

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

The stack uses linked nodes for storage, so first_ is a pointer to the first node.

Why am I getting this error?

like image 239
Austin Hyde Avatar asked Mar 04 '10 21:03

Austin Hyde


3 Answers

Your checkElements() function is not marked as const so you can't call it on const qualified objects.

top(), however is const qualified so in top(), this is a pointer to a const Stack (even if the Stack instance on which top() was called happens to be non-const), so you can't call checkElements() which always requires a non-const instance.

like image 190
CB Bailey Avatar answered Nov 04 '22 02:11

CB Bailey


You cannot call a non-const method from a const method. That would 'discard' the const qualifier.

Basically it means that if it allowed you to call the method, then it could change the object, and that would break the promise of not modifying the object that the const at the end of the method signature offers.

like image 24
David Rodríguez - dribeas Avatar answered Nov 04 '22 03:11

David Rodríguez - dribeas


You're calling a non-const method from a const method.

like image 4
Dave Bacher Avatar answered Nov 04 '22 03:11

Dave Bacher