2012-11-20 132 views
4

試圖刷新我的C++和STL熟練程度,遇到由我定義的結構鍵入的std :: map問題。相關代碼:std :: map插入錯誤:沒有操作符「<」匹配這些操作數

typedef struct key_t { 
    int a; 
    int b; 
    bool operator==(const key_t& rhs) 
    { 
     return (a == rhs.a) && (b == rhs.b); 
    } 
    bool operator<(const key_t& rhs) //added the when I saw this error, didn't help 
    { 
     return a < rhs.a; 
    } 
} key_t; 

std::map<key_t, int> fooMap; 

void func(void) 
{ 
    key_t key;   
    key.a = 1; 
    key.b = 2; 

    fooMap.insert(std::pair<key_t, int>(key, 100)); 
} 

錯誤看起來是這樣的:

"/opt/[redacted]/include/functional", line 133: error: no operator "<" matches these operands 
      operand types are: const key_t < const key_t 
      detected during: 
      instantiation of "bool std::less<_Ty>::operator()(const _Ty &, const _Ty &) const [with _Ty=key_t]" at line 547 of "/opt/[redacted]/include/xtree" 
instantiation of "std::_Tree<_Traits>::_Pairib std::_Tree<_Traits>::insert(const std::_Tree<_Traits>::value_type &) [with _Traits=std::_Tmap_traits<key_t, UI32, std::less<key_t>, std::allocator<std::pair<const key_t, UI32>>, false>]" 

我在做什麼錯?它是不是很糟糕/不可能使用結構作爲地圖鍵?或者我忽略的其他東西?

+1

+1對於格式正確的代碼,清楚地解釋了問題並顯示具體錯誤。 –

+1

您的'operator <'和您的'operator =='不一致,因爲只有'operator =='測試'b'。這不是你的問題的原因,但除非你解決它,否則你正在尋求麻煩。可能你應該把'operator <'改成'return a john

回答

5

bool operator<(const key_t& rhs) 

需要是一個const方法

bool operator<(const key_t& rhs) const 

兩者是不同的簽名,和std::less查找後者。後者作爲const方法,暗示它不會修改對象。然而,前者沒有const可能意味着可以對this進行修改。

一般來說,擁有const方法是一個好主意,即使你可以投入,它意味着對客戶承諾不會發生任何修改。

+0

+1正確答案 –

+0

謝謝。我來自C環境,所以我不熟悉應用於方法的const的用法。 – laughingcoyote

1

對於初學者,運營商必須是const。 (並且您不需要==運營商。)

您在哪裏學會了使用typedef爲struct。沒有理由。

最後,如果你想這兩個元素參與爲 的關鍵部分,你必須比較他們兩個:

struct Key 
{ 
    int a; 
    int b; 
    bool operator<(Key const& rhs) const 
    { 
     return a < rhs.a 
      || (!(rhs.a < a) && b < rhs.b); 
    } 
}; 

否則,Key(1, 2)Key(1, 3)將有效地 相等。

+0

不需要它,但看到C風格結構定義並不罕見。 –

+1

@DougT。我期望看到它的唯一地方是在設計用於C(以及C++)的頭文件中。我不能說我從來沒有在專業編寫的C++代碼中看到過它。這通常表明作者不瞭解C++,並且你不想僱用他。 –

相關問題