【问题标题】:Operator overloading confusion运算符重载混乱
【发布时间】:2015-10-04 15:59:24
【问题描述】:

我知道已经发布了很多关于运算符重载的问题,但是我无法让我的代码与我找到的任何示例一起使用。是的,我看过 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){/*...*/}
}

谁能告诉我我做错了什么?

【问题讨论】:

  • 您能否展示一个尝试使用您的函数的示例以及确切的编译器错误。
  • 我个人避免操作符重载,因为它比它值得的麻烦更多
  • 为什么cpp文件在X命名空间中有X类的成员函数?头文件中不是这种情况。
  • 这是一个很好的例子learncpp.com/cpp-tutorial/…

标签: c++ operator-overloading decrement unary-operator


【解决方案1】:

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

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

在实现时也是如此:

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

【讨论】:

  • 好的,现在这更有意义了。谢谢。
【解决方案2】:
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++ 标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2014-06-04
    • 2013-01-19
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多