2014-03-27 22 views
1

下面是這個簡單的代碼equal_range和2個重載有this指針沒有法律轉換

#include <map> 

class MyMap : public std::multimap<int*, int*> 
{ 
    public: 
    void foo(const int* bar) const 
    { 
     equal_range(bar); 
    } 
}; 


int main() 
{ 
    MyMap myMap; 

    int number; 
    myMap.foo(&number); 

    return 0; 
} 

它不編譯,並給出以下錯誤

error C2663: 'std::_Tree<_Traits>::equal_range' : 2 overloads have no legal conversion for 'this' pointer 

我見過很多有關此錯誤的主題,看起來這是一個const問題。它編譯好,如果我把foo(const int* bar)變成foo(int* bar)

問題是,我沒有看到foo內容應該如何改變我的MyMap對象。 std::multimap提出的equal_range一個const版本:

http://www.cplusplus.com/reference/map/multimap/equal_range/

什麼是我的問題嗎?

謝謝

+0

你知道最標準的庫類沒有被設計爲被繼承嗎?例如,['std :: multimap'](http://en.cppreference.com/w/cpp/container/multimap)[析構函數](http://en.cppreference.com/w/cpp/container/multimap /〜multimap)不是'virtual',所以不會在銷燬MyMap對象時被調用。 –

回答

1

檢查equal_range的定義:

pair<const_iterator,const_iterator> equal_range (const key_type& k) const; 

它需要一個恆定的參考key_typeconst key_type& k

你試圖供應什麼是一個指向常整型:const int* bar

爲什麼不這項工作,即使雙方的值const

  • 恆定的參考成整數const int& foo意味着你不能讓foo引用另一個整數,但它允許改變所引用的整數的值。
  • 指向常量整數const int* foo的指針意味着您可以讓foo指向另一個整數,但不能更改它指向的整數的值。

了地圖居然預期是const int*& k,但如果你提供一個int*只(不const)地圖會自動轉換這一點。

[編輯]

還要注意MyMap對象仍然無法通過將foo功能被改變,即使你改變const int*int*因爲仍然是在您foo函數結束另一個常量。該常數在最後聲明該函數爲常量,這意味着它不能修改其執行的當前對象。如果它試圖修改它或者調用任何可能修改它的東西,那麼你會得到一個編譯器錯誤。 (免責聲明:無論如何,都可以從const函數內修改類,但這是另一個主題。)

+0

這是微妙的,但我想我明白了。 我想做的是'key_type ='const int *'',但由於const原理不是類型的一部分,所以不可能這樣做。 使用簡單的'int *'的問題是函數不再保證它不會改變指向的值。我應該如何處理?謝謝 – OoDeLally

0

如果事實正確的編譯器消息可以給你答案。對於兩個重載(在const一個)中的一個:

/usr/local/include/c++/v1/map:1836:41: note: candidate function not viable: 1st argument ('const int *') 
     would lose const qualifier 

const int*是指向一個const int。該方法期望const key_type&,即const int*&變元,即參考(非constint*const

當困惑時,寧願寫const int*作爲int const*,這是同樣的事情。那麼你會更清楚地看到const int*&的區別。

對於您的代碼工作,請使用int*而不是const int*

0

我認爲這個問題與key_type的不匹配有關。 一方面你有一個多圖,key_type=int*而另一方面你通過key_type=const int*,從而試圖刪除key_type上的const限定符。我也對此感到困惑,因爲我在想的是擴大key_type以獲得應該兼容的const int*&。然而,這種不匹配發生在key_type本身。至少這是我能想到的唯一合乎邏輯的解釋。

我的建議是使key_typeconst int*並保持你的功能參數。畢竟,爲什麼你需要一個指向可變值的指針作爲映射關鍵字?

相關問題