2013-10-25 54 views
1

如果在以下功能发现它们都具有for循环,搜索一个整数位置相同。 Pop()编译,但我得到一个错误的top()必须处理const修饰符。堆类继承自eecs281heap,它存储一个函子Comp Comp,其中Comp是类型名。指导员告诉我们访问这个仿函数的唯一途径就是通过这个 - >(),所以我只是看着一些莅临指导。由于const函数和引用

错误:通过“常量”大“本次”的说法“布尔较大::运算符()(INT,INT)”丢弃预选赛

这发生在运行主INT以下后。通过测试,我已经知道构造函数可以正常工作。

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; 
    } 
} 
+1

难道是'比较'不是'const'吗? – juanchopanza

+0

我认为是这样,但我不允许改变任何类的汇编,所以当我通过更大的仿函数进行比较时,我不知道如何访问它与顶部() –

+0

它不会使很有道理。你是说'this-> compare'是一个'更大的'实例吗?如果是这样,你的代码被破坏,因为它假定'TYPE'是'int'。但是您可以即时创建一个本地'更大'的实例,它允许您调用非const方法。 – juanchopanza

回答

1

使greater一个const运营商的电话运营商:

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

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

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

1

它看起来像问题是compare成员已operator()声明为一个非const功能。因为它听起来像你不必改变的能力,你也许可以得到你想要通过声明它作为一个poorman_heap成员mutable的行为。

mutable关键字可以让你的对象是“物理const”(意为实际字节不改变,是“逻辑const”(意为字节可能会改变,但对象的值是不是在不同的区分基本上,这意味着对于const -ness的目的而言,某些“不计数”。我脑海中的经典示例是延迟初始化 - 您想声明类const上的get_value()函数,但是您也不会如果没有人使用它,则不想浪费时间计算价值,因此您声明价值mutable,现在即使它是const成员函数,也可以在get_value()之内计算并分配它。