0

以下代码不起作用,它给出了以下错误:

没有匹配函数调用类型为“const comparer”的对象

调用 'value_compare' 类型的对象(又名 'std::_ 1:: _map_value_compare, int, comparer, true>')不明确

这是代码:

struct comparer
{
    bool operator()(const std::string x, const std::string y)
    {
        return x.compare(y)<0;
    }
};


int main(int argc, char **argv)
{
    vector< map<string,int,comparer> > valMapVect;
    map<string,int,comparer> valMap;

    valMapVect.push_back(valMap);

}

它是用 Xcode 5.x 编译的(在 Mac 上也是如此)。

有人知道出了什么问题吗?我认为当我在 Linux 上编译它时它正在工作。可能吗?

4

1 回答 1

2

似乎libc++希望函数调用运算符 incomparer成为const成员函数:

struct comparer
{
    bool operator()(const std::string x, const std::string y) const
    {                                                      // ^^^^^ fixes the problem
        return x.compare(y)<0;
    }
};

就我个人而言,我会将参数作为std::string const&(注意&)传递,但这不会改变 libc++ 是否喜欢比较对象。我还不确定标准是否要求const存在。我没有发现这样的要求,这意味着必须将比较函数保留为mutable成员。然而,鉴于它通常是无状态的,最好从它派生而不浪费任何内存(即利用空基优化),这可能是 libc++ 所做的。目前还不是很清楚

  • 这是 libc++ 中的一个错误,即比较函数对象必须存储一个mutable成员。
  • 在标准中不要求函数调用运算符是const.
  • 在代码中使用它来进行函数调用操作符const

然而,最简单的解决方法是使函数调用 operator const

于 2013-11-02T22:35:12.277 回答