如果您注意到以下函数,它们都具有相同的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;
}
}
答案 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
。
比较器不是非常有意义的。