+ =运算符重载,但由于看到一个简单的+运算符,因此无法编译

时间:2011-02-25 19:43:08

标签: c++ operator-overloading

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

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

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

  

“A *”和“A *”类型的操作数无效   “B *”为二元'运算符+'。

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

2 个答案:

答案 0 :(得分:5)

您为B&重载了运算符。你试图传递一个指针,而不是B的实例或B的引用。以下应该编译:{{1​​}},尽管更可能的修复是:

an_a += *a_b;

还要注意动态分配和算术运算符重载不能很好地结合在一起。如果它只是动态分配的输入,那可能就好了。只是不要尝试用A an_a(some parameters); B a_b(some parameters); an_a += a_b; 分配结果并将其作为指针返回,否则你会发现为了避免内存泄漏,调用代码不能使用任何简单的表达式,这是你首先想要运算符重载的原因。

答案 1 :(得分:2)

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

另请注意,operator+=通过非const引用获取B。如果你正在改变那个操作员的右手参数,那么某个时候会有人非常惊讶和不快乐。改为const引用。