错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
Error: expression must have arithmetic, unscoped enum, or pointer type with operator overload
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;
}
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 标准::可选枚举的比较运算符
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 隐式不是带有枚举解释的运算符 (!)?
- 枚举和二进制或运算符(MISRA C++ 2008,4-5-2)
- 重载 std::字符串运算符+ 用于打印枚举名称
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 枚举类上的运算符+,起始值不为零
- 重载输入 (>>) 运算符以获取枚举字符串
- 枚举后位运算符上的重载相等运算符
- 枚举运算符不工作
- 枚举的复合赋值运算符真的应该根据其关联的算术运算符来定义吗?
- 枚举增量的运算符重载
- 类中枚举类的运算符重载
- C++11 类中放置的枚举类的重载运算符
- 根据运算符中的枚举值推断类型
- 如何重载枚举的<<运算符
- 枚举类型的重载>>运算符(工作日)
- 为什么可以使用范围运算符和类 A 名称在类 B 中访问类 A(公共)中的枚举
- 调用枚举<<运算符进行字符串组合