2013-10-25 94 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()之內計算並分配它。