错误:后缀“一元运算符unaryOperators :: operator ++(const unaryOperators&)”必须将“int”作为其参数。

3

unaryOperators operator++ (const unaryOperators &one);
如果这个在类内声明,我应该会得到错误信息"too many arguments"等等,但是我得到的错误信息是:

error: postfix ‘unaryOperators unaryOperators::operator++(const unaryOperators&)’ must take ‘int’ as its argument

为什么必须以‘int’作为参数?这是什么意思?

GCC Linux

4个回答

5

摘自这里:

由于前缀和后缀++运算符都可以有两个定义,因此C ++语言为我们提供了两个不同的签名。它们都被称为operator++(),但前缀版本不带参数,后缀版本带一个虚拟整数。


5

在增量操作中有两种不同的运算符,后缀和前缀。

后缀运算符重载需要一个虚拟的 int 参数来区分它。

T& operator ++(T& a);     //prefix
T operator ++(T& a, int); // postfix

7
我不知道Bjarne如何在夜晚入睡,因为他的语言中有这个功能。 - TonyK

3

有两个++运算符。一个不带参数(前缀),另一个带一个整型参数(后缀)。编译器认为你想使用第二个(注意错误信息中的“后缀”一词),并告诉你参数类型错误。从你的困惑来看,编译器试图帮助你是误导了你,实际上你想要使用第一个。


2
假设你想重载前缀操作符(++x),可以这样做:
  • 一个没有参数的非静态成员函数,operator++();或
  • 一个带有一个参数的非成员函数,operator++(const unaryOperators&)
如果你将其声明为带参数的成员函数,则被解释为后缀运算符(x++)的声明;然而,后缀运算符必须使用类型为int的虚拟参数进行声明,而不是你的类型,因此会出现错误。
因此,要么删除函数参数,并使操作符作用于this;要么将函数移到类外部;或者如果需要访问类型的私有成员,则将其设置为friend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接