无法在矢量中推送地图?

时间:2013-11-02 21:08:10

标签: c++ vector map

以下代码不起作用,它会出现以下错误:

  

没有匹配函数来调用'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上进行编译时工作了。有可能吗?

1 个答案:

答案 0 :(得分:2)

似乎libc++希望comparer中的函数调用运算符成为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

最简单的解决方法是使函数调用运算符const