为什么运营商<被定义为非会员?

时间:2013-05-13 03:37:45

标签: c++ map hashmap

我在hash_map上做了一些测试,使用struct作为键。我定义struct:

struct ST
{

    bool operator<(const ST &rfs)
    {
        return this->sk < rfs.sk;
    }

    int sk;
};

size_t hash_value(const ST& _Keyval)
{   // hash _Keyval to size_t value one-to-one
    return ((size_t)_Keyval.sk ^ _HASH_SEED);
}

然后:

stdext::hash_map<ST, int> map;
ST st;
map.insert(std::make_pair<ST, int>(st, 3));

它给我一个编译器错误:binary'&lt;' :找不到哪个运算符带有'const ST'类型的左手操作数(或者没有可接受的转换)

所以我将运算符更改为非成员:

bool operator<(const ST& lfs, const ST& rfs)
{
    return lfs.sk < rfs.sk;
}

没关系。所以我想知道为什么?

3 个答案:

答案 0 :(得分:4)

您错过了const

bool operator<(const ST &rfs) const
{
    return this->sk < rfs.sk;
}

答案 1 :(得分:0)

我认为问题是

错误:二进制'&lt;' :找不到哪个运算符采用'const ST'类型的左手操作数(或者没有可接受的转换)

您的成员函数bool operator<(const ST &rfs)被声明为非const,因此无法针对const ST调用它。

只需将其更改为bool operator<(const ST &rfs) const即可正常使用

答案 2 :(得分:0)

尽管有上述答案,我建议你看一下:

C ++ Primer,第四版,第14章,第14.1节

  

通常我们将算术和关系运算符定义为   非成员函数,我们将赋值运算符定义为成员: