将此代码放在一个简单的类中,由一个arduino项目的两个整数(日/小时)组成。
bool operator <= (const Time& other) const{
return (day <= other.day && hour <= other.hour);
}
虽然我确实有一个几乎完全相同(并且正在工作)的其他类,它使用相同的语法和相同的非静态形式...我得到以下错误:
error: non-member function ‘bool operator<=(const Time&)’ cannot have cv-qualifier
error: ‘bool operator<=(const Time&)’ must take exactly two arguments
尽管我花了最后半小时在谷歌上搜索类似的错误,但我还是感到茫然。 谢谢!
答案 0 :(得分:3)
您有一个非会员比较运算符。它是一个非成员而不是成员是有道理的,但它需要两个参数,而不能是const
:
bool operator <= (const Time& lhs, const Time& rhs) { .... }
此外,您需要修复比较的逻辑。我很懒,所以我会这样做:
#include <tuple>
bool operator <= (const Time& lhs, const Time& rhs)
{
return std::tie(lhs.day, lhs.hour) <= std::tie(rhs.day, rhs.hour);
}
有关operator overloading here的更多信息,请参阅
答案 1 :(得分:1)
error: non-member function ‘bool operator<=(const Time&)’ cannot have cv-qualifier
您不能将const限定符添加到非成员函数。 让我解释一下为什么
成员函数之后的const保证此函数不会更改this
的任何成员变量。现在,如果你没有任何this
引用,静态函数会保证什么?
error: ‘bool operator<=(const Time&)’ must take exactly two arguments
有两种方法可以重载运算符。你可以使它们成为成员函数(没有静态),但是如果你想比较int
和Time
那么..让我们把它写出来:
bool operator<=(int rhs) const {return this.minutes <= rhs;}
现在,让我们比较一下我们的数据:
Time time;
int integer;
if(time <= integer) {} //This will compile
if(integer <= time) () //This will not compile
让我们看看为什么:
if(time <= integer) {} //Will expand to this:
if(time.operator<=(integer)) {}
现在可以猜出这是做什么的吗?
if(integer <= time) {} //Will expand to this:
if(integer.operator<=(time)) {}
对于像整数这样的默认类型,没有这样的运算符,你不能简单地只添加一个整数类型。
对此的解决方案是静态运算符。 涵盖两种情况(int&lt; = Time and Time&lt; = int) 您也可以在Time类中编写此运算符
static bool operator<=(int lhs, const Time& rhs) {};
参数是比较的左侧和比较的右侧。
我还建议你看一下juanchopanza的链接:
有关operator overloading here的更多信息,请参阅
和this link了解成员函数运算符和非成员函数运算符之间的区别。
答案 2 :(得分:0)
如果将此运算符声明为类成员函数,则需要按以下方式定义
bool Time::operator <= (const Time& other) const{
return (day <= other.day && hour <= other.hour);
}
还要考虑到运营商内部的条件无效。 应该有
bool Time::operator <= (const Time& other) const{
return ( day <= other.day ) && ( other.day > day || hour <= other.hour ) );
}