2013-11-22 46 views
1

當我嘗試的元素插入到一個unordered_set我得到這個錯誤:unordered_set:無效操作數爲二進制表達式(「常量播放」和「常量播放」)

error: invalid operands to binary expression ('const Play' and 'const Play') 
     {return __x == __y;} 

這裏的截圖整個錯誤: https://www.dropbox.com/s/nxq5skjm5mvzav3/Screenshot%202013-11-21%2020.11.24.png

這是我的散列函數:

struct Hash { 

     size_t operator() (Play &play) { 

      unsigned long hash = 5381; 
      int c; 

      string s_str = play.get_defense_name() + play.get_offense_name() + play.get_description(); 
      const char * str = s_str.c_str(); 

      while ((c = *str++)) 
       hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

      cout << hash << endl; 
      return hash; 

     } 
    }; 

這是我宣佈unordered_list:

unordered_set<Play, Hash> Plays; 

這是我的重載我Play==

friend bool operator== (Play& p1, Play& p2) 
    { 
     return 
      (p1.get_defense_name() == p2.get_defense_name()) && 
      (p1.get_offense_name() == p2.get_offense_name()) && 
      (p1.get_description() == p2.get_description()); 
    } 

任何想法可能是怎麼回事?

謝謝。

+1

試着改變你的'運營商的簽名=='使用'const'。就像在'friend bool operator ==(const Play&p1,const Play&p2)'中一樣。邏輯運算符最好不要改變他們正在比較的對象。 –

回答

4

錯誤是說它試圖比較const Playconst Play,但你只爲了Play

friend bool operator== (const Play& p1, const Play& p2) 
    { 
     return 
      (p1.get_defense_name() == p2.get_defense_name()) && 
      (p1.get_offense_name() == p2.get_offense_name()) && 
      (p1.get_description() == p2.get_description()); 
    } 
2

看起來無序集提供operator ==正在尋找比較恆定的Play對象,但你==報價比較非常量的。由於不允許丟棄const,所以編譯器會產生錯誤。添加常量性應該解決這個問題:

friend bool operator== (const Play& p1, const Play& p2) 

您應該添加constoperator()還有:

size_t operator() (const Play &play) 
相關問題