运算符重载混乱

Operator overloading confusion

我知道有很多关于运算符重载的问题,但我无法让我的代码与我找到的任何示例一起工作。是的,我已经看过 this link,但我仍然无法理解这一点。

我试图只重载前缀运算符,但我收到一条错误消息,提示后缀需要一个 int。我不是要修改后缀运算符。 我有一个 .h 文件和一个 .cpp 文件。在我的 .h 文件中,我有类似的东西:

class X{
public:
        /* ... declarations of X ... */
        X& operator--(X& x);
};

在我的 .cpp 文件中,我有类似的东西:

#include "X.h"
namespace X{
X& X::operator--(X& x){/*...*/}
}

谁能告诉我哪里做错了?

X& operator--(X& x);

必须是:

X& operator--();

背景:编译器发现您已经为 -- 运算符提供了一个参数。 -- 的后缀版本接受一个参数,所以它认为你的意思是那个。但该参数的类型必须按照惯例为 int。所以它准确地告诉你:postfix 'X& X::operator--(X&)' must take 'int' as its argument.

编译器 可以 也可以告诉你类似 prefix 'X& X::operator--(X&)' must not take any argument 的东西,如果它愿意的话。但是,哦,好吧。它就是这样儿的。产生任何诊断信息就足以符合C++标准。

前缀 -- 运算符不带参数。它的定义应该如下:

public:
    /* ... declarations of X ... */
    X& operator--();
};

实施时也类似:

#include "X.h"
namespace X {
    X& X::operator--() {/*...*/}
}