运算符重载,const和#arguments错误

时间:2014-02-24 21:58:58

标签: c++ operator-overloading

将此代码放在一个简单的类中,由一个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

尽管我花了最后半小时在谷歌上搜索类似的错误,但我还是感到茫然。 谢谢!

3 个答案:

答案 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

有两种方法可以重载运算符。你可以使它们成为成员函数(没有静态),但是如果你想比较intTime那么..让我们把它写出来:

在你的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 ) );
}