1

如果您在以下函数中注意到它们都有相同的用于搜索整数位置的 for 循环。Pop() 编译但我得到一个错误,因为 top() 与 const 限定符有关。heap 类继承自 eecs281heap,它存储了一个函子 Comp 比较,其中 Comp 是类型名。讲师告诉我们访问函子的唯一方法是通过 this->() 所以我只是在这里寻找一些指导。谢谢

错误:将 'const large' 作为 'bool large::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); 
}

PS 更大的是

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

2 回答 2

1

看起来问题在于该compare成员已operator()声明为非const函数。由于听起来您没有能力更改它,因此您可以通过将其声明mutablepoorman_heap.

mutable关键字可以让您区分对象是“物理上” const(意味着实际字节不会改变)和“逻辑上const”(意味着字节可能会改变,但对象的值在基本意义上没有不同)。基本上它意味着出于const-ness的目的,某些东西“不重要”。在我看来,典型的例子是惰性初始化——你想get_value()在一个类上声明函数const,但你也不想浪费时间计算值,如果没有人使用它,所以你声明了这个值mutable,现在你可以计算它并在里面分配它,get_value()即使它是一个const成员函数。

于 2013-10-25T06:02:29.603 回答
1

使操作员的呼叫操作greaterconst

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

这同样适用于任何this->compare解决方案。它需要是const

比较器是非常量没有多大意义。

于 2013-10-25T06:03:50.743 回答