自定义类型作为键的映射 - 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就足够了。

+0

谢谢。那就是诀窍。 – 2009-05-25 11:02:36

+0

你可以进入更多的细节?为什么你只需要operator ? – bobobobo 2009-12-06 18:38:24

+14

,因为您可以从操作符和运算符==。 '(b b)',所以有operator>。 (!(a skrebbel 2010-08-23 08:39:42

它可能正在寻找const成员操作符(不管正确的名称是什么)。 这工作(注常量):

bool operator<(const Foo& foo1) const { return foo_value < foo1.foo_value;} 

编辑:从我的答案被删除operator>,因为它并不需要(从问题的复制/粘贴),但它吸引了评论:)

注:我100%确定你需要const,因为我编译了这个例子。

+2

你不需要> – 2009-05-25 11:04:25

+0

有趣的计算器显示以前的答案10分钟前,但是当我提交我的答案时,还没有任何...因此相同的答案 – stefanB 2009-05-25 11:05:09

+0

由于对象是常量const函数将是必需的。 – siddhusingh 2013-08-12 12:50:23

注意const之后的参数,这是为了让“你的”(比较中的左侧)对象为常量。

请您详细说明一下吗?为什么如果你让const成员(就我所知,这意味着它不能改变对象的状态 - 例如修改私有变量)可以保证“你的”将成为左侧?

请您详细说明一下吗?为什么如果你让const成员(就我所知,这意味着它不能改变对象的状态 - 例如修改私有变量)可以保证“你的”将成为左侧?

我还没有备受好评的评论。

const不会神奇地确保“你的”将成为左手边。这张海报是说左手边(即x in x < y)是比较被调用的对象。正如你保护y的成员免受const对运算符<的影响一样,你也希望在方法签名结束时保护x的成员免受const的影响。