以下代码不起作用,它会出现以下错误:
没有匹配函数来调用'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上进行编译时工作了。有可能吗?
答案 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 ++所做的。
mutable
成员。const
。const
。最简单的解决方法是使函数调用运算符const
。