小于运算符不能作为成员函数重载
Posted
技术标签:
【中文标题】小于运算符不能作为成员函数重载【英文标题】:Less than operator cannot be overloaded as member function 【发布时间】:2017-07-16 05:06:38 【问题描述】:我想在map
中使用我的class
作为key
,所以我重载了operator+
。如果我将它作为友元函数重载,它会很好地工作。当我将它作为类中的成员函数重载时,会导致编译错误。
错误 C2678:二进制“。
详细来说,这不会编译,并产生编译错误:
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;
我不知道为什么。我知道 operator
【问题讨论】:
由于重载解析和隐式转换的工作方式,friend
版本是一个更好的主意。
友好版本指定,两个操作数都为const
,另一个版本只表示输入参数为const
。你必须把方法标记为……你必须仔细阅读错误,特别注意const
、signed
等词的含义。
【参考方案1】:
通常,operator<
等成员运算符不会修改它们所操作的对象。如果是这种情况,您需要通过将关键字 const
放在声明的末尾来指定该方法是常量,即
class Syl
...
public:
bool operator<(const Syl& rhs) const;
这样的运算符可以与 std::map
等 STL 容器一起使用。
您当前版本的成员运算符,当翻译成独立运算符时将如下所示:
friend bool operator<(Syl& lhs, const Syl& rhs);
注意lhs
缺少const
。它本身仍然是正确的,但不典型。您需要提供一个左值lhs
。如果您提供其他内容,则会收到 ``no operator found...'' 错误。 STL std::map
也不希望这样,因此您的错误可能源于标准标头,位于模板实现的深处。
【讨论】:
所以编译时错误不是来自他声明重载运算符的方式,而是来自成员重载运算符用于订购只接受重载<
运算符的映射如果它的两个参数都是 const ?
是的,就是这样。
这是正确的 - 操作员不需要是const
。有些通常不是(例如operator=
),有些通常是。但请注意,非常量运算符需要 lvalue
作为左参数,如果不提供,您将收到类似的错误。
感谢非常详细的解释。【参考方案2】:
假设a
和b
都是Syl
类型,如果a
是const
,则您的第一个(成员表单)在表达式a < b
中无效,并且会导致编译错误.
要解决这个问题,您需要将成员 operator<()
指定为
bool operator< (const Syl& rhs) const; // note the trailing const
如果没有尾随 const
,在表达式 a < b
中,a
不能是 const
(即允许 operator<()
更改它)。
您的第二种形式是正确的,因为它指定两个操作数都是const
引用。
<
等比较运算符通常不会更改其操作数中的任何一个。 const
限定词传达了这一事实。
请记住,您可以提供会员表格或非会员表格。两者都提供会由于歧义而导致错误(当编译器看到像a < b
这样的表达式时,编译器没有理由优先选择其中一个)。
【讨论】:
以上是关于小于运算符不能作为成员函数重载的主要内容,如果未能解决你的问题,请参考以下文章