我想在class
中使用key
作为map
,因此我重载operator+
。如果我将它作为友元函数重载,它的效果很好。当我将它作为成员函数重载在类中时,会导致编译错误。
错误C2678:二进制'<':找不到带有' const Syl'类型的左手操作数的运算符(或者没有可接受的转换)' 。
详细说明,这不编译,并生成编译错误:
Syl.h
bool operator< (const Syl& rhs);
Syl.cpp
bool Syl::operator< (const Syl& rhs) { return false; }
虽然这可以编译。
Syl.h
friend bool operator< (const Syl& lhs, const Syl& rhs);
Syl.cpp
bool operator< (const Syl& lhs, const Syl& rhs) { return false; }
我不知道为什么。我知道那个运营商&lt;是二进制的,但无论如何都要将它作为函数成员重载?
答案 0 :(得分:3)
通常,operator<
等成员操作员不会修改他们操作的对象。如果是这种情况,您需要通过将关键字const
放在声明的末尾来指定方法是常量,即
class Syl {
...
public:
bool operator<(const Syl& rhs) const;
}
像这样的运算符可以与STL容器一起使用,例如std::map
。
成员运算符的当前版本在转换为独立运算符时将显示为:
friend bool operator<(Syl& lhs, const Syl& rhs);
请注意const
缺少lhs
。它本身仍然是正确的,但非典型的。您需要提供l值作为lhs
。如果你提供其他东西,你会得到``no operator found found'''错误。 STL std::map
也不期望你的错误,可能源于标准头文件,在模板实现的深处。
答案 1 :(得分:2)
假设a
和b
都属于Syl
类型,如果a < b
为{a
,则您的第一个(成员表单)在表达式const
中无效{1}},将导致编译错误。
要解决此问题,您需要将成员operator<()
指定为
bool operator< (const Syl& rhs) const; // note the trailing const
如果没有结尾const
,则在a < b
表达式中,a
不能为const
(即允许operator<()
更改它)。
您的第二个表单是正确的,因为它指定两个操作数都是const
引用。
<
之类的比较运算符通常不会改变其操作数。 const
限定符传达了这一事实。
请记住,您可以提供会员表格或非会员表格。提供两者都会由于歧义而导致错误(当编译器看到像a < b
这样的表达式时,编译器没有依据优先于其他的优先选择。