const函数和引用

时间:2013-10-25 05:47:40

标签: c++ templates const

如果您注意到以下函数,它们都具有相同的for循环以搜索整数位置。 Pop()编译,但我得到一个错误的top()与const限定符有关。堆类继承自eecs281heap,它存储一个仿函数Comp compare,其中Comp是typename。教练告诉我们访问仿函数的唯一方法是通过this->()所以我只是在这里寻找一些指导。感谢

错误:将'const larger'作为'bool greater :: operator()(int,int)的'this'参数传递'丢弃限定符

在int main中运行以下命令后会发生这种情况。通过测试,我已经知道构造函数正常工作。

vector <int> data={10,2,13};
poorman_heap<int,larger> y(data.begin(),data.end());

template<typename TYPE, typename COMP>
void poorman_heap<TYPE, COMP>::pop() {
    int location=0;
    for(int i=1;i<data.size();i++){
        if(this->compare(data.at(i),data.at(location))){
            location=i;
        }
    }
    data.erase(data.begin()+location);
    return;
}

template<typename TYPE, typename COMP>
const TYPE& poorman_heap<TYPE, COMP>::top() const {
    int location=0;
    for(int i=1;i<data.size();i++){
        if(this->compare(data.at(i),data.at(location))){
            location=i;
        }
    }
    return data.at(location); 
}

P.S。更大的是

struct greater{
    bool operator()(int x,int y){
        return x>y;
    }
}

2 个答案:

答案 0 :(得分:1)

看起来问题是compare成员已将operator()声明为非const函数。由于您似乎没有能力对其进行更改,因此您可以通过在mutable中将其声明为poorman_heap成员来获得所需的行为。

使用mutable关键字可以区分“物理const”对象(意味着实际字节不会更改,并且“逻辑const”(意味着字节可能会更改)但是从根本上说,对象的价值并没有什么不同。基本上它意味着为了const - ness的目的,“不计算”的东西。我脑海中的经典例子是懒惰的初始化 - 你想在类get_value()上声明const函数,但如果没有人使用它,你也不想浪费时间计算值,所以你声明值mutable现在您被允许计算并在get_value()内分配给它,即使它是const成员函数。

答案 1 :(得分:1)

使greater const运算符的调用运算符:

struct greater
{
    bool operator()(int x,int y) const
    {
        return x>y;
    }
}

同样适用于this->compare解析的任何内容。它必须是const

比较器不是非常有意义的。