0

我对 hash_map 做了一些测试,使用 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));

它给了我一个编译器错误:二进制'<':找不到运算符,它采用'const ST'类型的左操作数(或者没有可接受的转换)

所以我将运营商更改为非会员:

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

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

4

3 回答 3

4

你错过了一个const

bool operator<(const ST &rfs) const
{
    return this->sk < rfs.sk;
}
于 2013-05-13T03:44:38.740 回答
0

我相信问题是

错误:二进制“<”:未找到采用“const ST”类型的左操作数的运算符(或没有可接受的转换)

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

只需将其更改为bool operator<(const ST &rfs) const它应该可以工作

于 2013-05-13T03:48:05.520 回答
0

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

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

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

于 2013-05-13T05:09:40.607 回答