错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型

Error: expression must have arithmetic, unscoped enum, or pointer type with operator overload

本文关键字:枚举 运算符 重载 类型 指针 作用域 表达式 错误      更新时间:2023-10-16

I 重载前缀和后缀递增和递减运算符。我可以打电话给他们,他们在分配操作中工作得很好,而且只是"自己"。 但是,我不能从与此类前缀运算符一起使用的对象调用成员函数。不过,一切都适用于后缀表示法。 编译器给了我 2 个错误:

  • 表达式必须具有算术、无作用域枚举或指针类型
  • ">
  • ++"/"--"需要 l 值

我不明白为什么会这样。

谢谢。

#include<iostream>
using namespace std; //I know I shouldn't do this in real projects
class Time
{
public:
Time() : hrs(0), mins(0), secs(0) {};
Time(int m_hrs, int m_mins, int m_secs) : hrs(m_hrs), mins(m_mins), secs(m_secs) {};
void display()
{
cout << hrs << ':' << mins << ':' << secs;
} const 
Time operator+(Time time) const
{
int tmp_hrs = hrs + time.hrs;
int tmp_mins = mins + time.mins;
int tmp_secs = secs + time.secs;
if (tmp_secs >= 60)
{
tmp_secs -= 60;
tmp_mins++;
}
if (tmp_mins >= 60)
{
tmp_mins -= 60;
tmp_hrs++;
}
if (tmp_hrs >= 24)
{
tmp_hrs -= 24;
}
return { tmp_hrs, tmp_mins, tmp_secs };
}
Time operator++()
{
Time tmp(hrs, mins, secs);
tmp.secs++;
tmp.resolve_overflow();
hrs = tmp.hrs;
mins = tmp.mins;
secs = tmp.secs;
return tmp;
}
Time operator++(int)
{
Time to_return(hrs, mins, secs);
Time tmp(hrs, mins, secs);
tmp.secs++;
tmp.resolve_overflow();
hrs = tmp.hrs;
mins = tmp.mins;
secs = tmp.secs;
return to_return;
}
Time operator--()
{
Time tmp(hrs, mins, secs);
tmp.secs--;
tmp.resolve_underflow();
hrs = tmp.hrs;
mins = tmp.mins;
secs = tmp.secs;
return tmp;
}
Time operator--(int)
{
Time to_return(hrs, mins, secs);
Time tmp(hrs, mins, secs);
tmp.secs--;
tmp.resolve_underflow();
hrs = tmp.hrs;
mins = tmp.mins;
secs = tmp.secs;
return to_return;
}
private:
int hrs;
int mins;
int secs;
void resolve_overflow()
{
if (secs >= 60)
{
secs -= 60;
mins++;
}
if (mins >= 60)
{
mins -= 60;
hrs++;
}
if (hrs >= 24)
{
hrs -= 24;
}
}
void resolve_underflow()
{
if (secs < 0)
{
secs = 59;
mins--;
}
if (mins < 0)
{
mins = 59;
hrs--;
}
if (hrs < 0)
{
hrs = 23;
}
}
};

int main()
{
Time t1(0,0,0);
++t1.display(); cout << endl;
return 0;
}

您正在尝试增加 void,这是 display(( 的返回类型。

这清楚地表明++是针对对象的。

int main()
{
Time t1(0,0,0);
(++t1).display(); cout << endl;
return 0;
}

另外,我不确定为什么要为前缀运算符++创建一个随机对象。为什么不像基本类型那样通过引用返回相同的对象?

Time& operator++()
{
this->secs++;
resolve_overflow();
return *this;
}