我已经重载了+和+ =运算符,并带有以下签名:
// 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;
答案 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_a
和a_b
都是指针,因此您必须取消引用它们才能使用运算符:*an_a += *a_b;
。
另请注意,operator+=
通过非const引用获取B
。如果你正在改变那个操作员的右手参数,那么某个时候会有人非常惊讶和不快乐。改为const
引用。