自定义类型作为键的映射 - C++
我想分配一个自定义类型作为std :: map的键。这是我用作钥匙的类型。自定义类型作为键的映射 - C++
struct Foo
{
Foo(std::string s) : foo_value(s){}
bool operator<(const Foo& foo1) { return foo_value < foo1.foo_value; }
bool operator>(const Foo& foo1) { return foo_value > foo1.foo_value; }
std::string foo_value;
};
当的std ::地图,我收到以下错误使用。
error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Foo' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\include\functional 143
如果我改变像下面的结构,一切正常。除了使操作符重载为朋友
struct Foo
{
Foo(std::string s) : foo_value(s) {}
friend bool operator<(const Foo& foo,const Foo& foo1) { return foo.foo_value < foo1.foo_value; }
friend bool operator>(const Foo& foo,const Foo& foo1) { return foo.foo_value > foo1.foo_value; }
std::string foo_value;
};
没有改变。我想知道为什么我的第一个代码不工作?
有什么想法?
我怀疑你需要
bool operator<(const Foo& foo1) const;
注意const
的论点后,这是为了让“你”(在比较中左侧)对象不变。
只需要一个操作员的原因是它足以实现所需的顺序。为了回答这个抽象问题“是否必须在B之前?”知道a是否小于b就足够了。
它可能正在寻找const成员操作符(不管正确的名称是什么)。 这工作(注常量):
bool operator<(const Foo& foo1) const { return foo_value < foo1.foo_value;}
编辑:从我的答案被删除operator>
,因为它并不需要(从问题的复制/粘贴),但它吸引了评论:)
注:我100%确定你需要const,因为我编译了这个例子。
你不需要> – 2009-05-25 11:04:25
有趣的计算器显示以前的答案10分钟前,但是当我提交我的答案时,还没有任何...因此相同的答案 – stefanB 2009-05-25 11:05:09
由于对象是常量const函数将是必需的。 – siddhusingh 2013-08-12 12:50:23
注意const之后的参数,这是为了让“你的”(比较中的左侧)对象为常量。
请您详细说明一下吗?为什么如果你让const成员(就我所知,这意味着它不能改变对象的状态 - 例如修改私有变量)可以保证“你的”将成为左侧?
请您详细说明一下吗?为什么如果你让const成员(就我所知,这意味着它不能改变对象的状态 - 例如修改私有变量)可以保证“你的”将成为左侧?
我还没有备受好评的评论。
const不会神奇地确保“你的”将成为左手边。这张海报是说左手边(即x in x < y)是比较被调用的对象。正如你保护y的成员免受const对运算符<的影响一样,你也希望在方法签名结束时保护x的成员免受const的影响。
谢谢。那就是诀窍。 – 2009-05-25 11:02:36
你可以进入更多的细节?为什么你只需要operator ? – bobobobo 2009-12-06 18:38:24
,因为您可以从操作符和运算符==。 '(b b)',所以有operator>。 (!(a skrebbel 2010-08-23 08:39:42