unordered_set:二进制表达式的操作数无效("const Play"和"const Play")

unordered_set: invalid operands to binary expression ('const Play' and 'const Play')

本文关键字:const Play 无效 操作数 set 二进制 表达式 unordered      更新时间:2023-10-16

当我试图将一个元素插入到一个无序集合中时,会出现这个错误:

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_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()); 
    }

知道这里会发生什么吗?

谢谢。

错误是说它试图比较const Playconst Play,但您只为Play 提供operator ==

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()); 
    }

看起来无序集想要比较常量Play对象,但您的==可以比较非常量对象。由于不允许删除常量,因此编译器会产生错误。添加常量应该可以解决问题:

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

您也应该将const添加到operator()中:

size_t operator() (const Play &play)