【问题标题】:+= operator overloaded, but use won't compile since it sees a simple + operator+= 运算符重载,但 use 不会编译,因为它看到一个简单的 + 运算符
【发布时间】:2011-02-25 19:43:07
【问题描述】:

我已经重载了 + 和 += 运算符,具有以下签名:

// within A's header file..
A operator+(const B &p);    
A &operator+=(B &p);

为什么当我尝试使用 += 运算符时,我收到编译器错误消息

“A*”类型的无效操作数和 "B*" 转二进制 'operator+'。

an_a; // an instance of class A
B *a_b = new B(some_parameters);
an_a += a_b;

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    您为B& 重载了运算符。您正在尝试将指针传递给它,而不是 B 的实例或对 B 的引用。以下应该编译:an_a += *a_b;,尽管更可能的修复是:

    A an_a(some parameters);
    B a_b(some parameters);
    an_a += a_b;
    

    还要注意动态分配和算术运算符重载不能很好地结合使用。如果只有动态分配的输入可能没问题。只是不要尝试使用 new 分配 result 并将其作为指针返回,否则您会发现为了避免内存泄漏,调用代码不能使用任何简单的表达式是您首先希望运算符重载的原因。

    【讨论】:

    • 啊,对不起,我错过了您报告的错误消息与您的代码 sn-p 不一致。代码中的注释声称an_a 是A 类的一个实例,但错误消息声称它不是,它是一个指针。你不能为两边的指针重载operator+=,所以如果两个操作数都是指针,那么我认为p1 += p2总是意味着p1 = p1 + p2
    • ... 或者无论如何,p1 += p2p1 = p1 + p2 都不是有效的,并且您不能通过运算符重载使它们有效。不过,我不知道为什么编译器会以这种特殊方式抱怨,而不是抱怨与 operator+= 匹配失败。
    • 如果 an_a 是一个指针,您可以尝试取消对两者的引用:*an_a += *a_b;
    【解决方案2】:

    您的错误信息与代码中的 cmets 不一致。看起来an_aa_b 都是指针,因此您必须取消对它们的引用才能使用运算符:*an_a += *a_b;

    另请注意,您的 operator+= 通过非常量引用获取 B。如果您要更改该运算符的右手参数,有时某人会感到非常惊讶和不高兴。改为const 参考。

    【讨论】:

    • “非常惊讶和不开心”,很好的理解,出于同样的原因,operator+ 应该采用 const LHS。所以如果定义为成员函数,A operator+(const B&) const;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多