C++ 丢弃限定符错误

C++ 丢弃限定符错误,c++,C++,对于我的compsci类,我正在实现一个堆栈模板类,但遇到了一个奇怪的错误: Stack.h:在成员函数“const T Stack::top()const[with T=int]”中: Stack.cpp:10:错误:将“void Stack::checkElements()[with T=int]”的“const Stack”作为“此””参数传递将丢弃限定符 Stack::top()如下所示: const T top() const { checkElements(); re

对于我的compsci类,我正在实现一个堆栈模板类,但遇到了一个奇怪的错误:

Stack.h:在成员函数“
const T Stack::top()const
[with T=int]”中:

Stack.cpp:10:错误:将“
void Stack::checkElements()
[with T=int]”的“
const Stack
”作为“
此”
”参数传递将丢弃限定符

Stack::top()
如下所示:

const T top() const {
    checkElements();
    return (const T)(first_->data);
}
void checkElements() {
    if (first_==NULL || size_==0)
        throw range_error("There are no elements in the stack.");
}
Stack::checkElements()
如下所示:

const T top() const {
    checkElements();
    return (const T)(first_->data);
}
void checkElements() {
    if (first_==NULL || size_==0)
        throw range_error("There are no elements in the stack.");
}
堆栈使用链接的节点进行存储,因此
first\uu
是指向第一个节点的指针


为什么会出现此错误?

不能从常量方法调用非常量方法。这将“丢弃”常量限定符

基本上,这意味着如果它允许您调用该方法,那么它可能会更改对象,这将打破不修改方法签名末尾的
常量提供的对象的承诺。

您的
checkElements()
函数未标记为
const
,因此不能在
const
限定对象上调用它


top()
,但是const是限定的,所以在
top()
中,这个
是指向const
堆栈的指针(即使调用
top()
堆栈
实例恰好是非
const
),所以不能调用
checkElements()
它总是需要一个非常量实例。

您正在从常量方法调用一个非常量方法

因为checkElements()未声明为常量

void checkElements() const {
    if (first_==NULL || size_==0)
        throw range_error("There are no elements in the stack.");
}
如果没有该声明,则无法对常量对象调用checkElements