重载运算符 = 错误
OVERLOADING OPERATORS = error
我正在尝试使用重载概念来等同 3 个对象c1
、c2
、c3
。但它给了我一个错误
error: no match for 'operator=' in 'c3 = c2. circle::operator=(((circle&)(& c1)))'
它背后的原因是什么,我该如何纠正它?
#include<iostream>
using namespace std;
class circle
{
private:
int radius;
float x,y;
public:
circle()
{}
circle(int rr,float xx,float yy)
{
radius=rr;
x=xx;
y=yy;
}
circle& operator=(const circle& c)
{
cout<<endl<<"assignment operator invoked";
radius=c.radius;
x=c.x;
y=c.y;
return *this;
}
void showdata()
{
cout<<endl<<"n radius="<<radius;
cout<<endl<<"x coordinate="<<x;
cout<<endl<<"y coordinate="<<y<<endl;
}
};
int main()
{
circle c1 (10,2.5,2.5);
circle c2,c3;
c3=c2=c1;
c1.showdata();
c2.showdata();
c3.showdata();
return 0;
}
所以这个重载运算符将被调用两次。第一个为 c2=c1然后对于 c3=c2,但编译器如何将其与重载运算符定义进行比较?
为了链接operator=
调用,必须确保它返回引用
circle& operator=(const circle& c)
{
cout<<endl<<"assignment operator invoked";
radius=c.radius;
x=c.x;
y=c.y;
return *this;
}
c1=c2=c3
解析为 c1 = (c2 = c3)
。如果 operator =
不返回引用,则c2 = c3
是 rvalue,并且它不能绑定到 c1.operator =
的引用参数(如果参数是对 const 的引用,它可以绑定到 rvalues,但这并不意味着你不应该返回引用(。
另请注意,通过 const 引用获取参数是有意义的,因为您不想更改分配的参数。
还要记住三法则,也就是说,如果您确实需要执行以下任何操作:
过载
operator =
显式提供复制构造函数
显式提供析构函数
那么你可能也想做另外两个。在您的特定情况下,您似乎根本不需要超载operator =
。
相关文章:
- 在运算符重载定义中使用成员函数(const错误)
- 逻辑运算符上出现错误代码 a')'
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- C++:需要帮助了解运算符重载错误
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- C++分数混合比较运算符错误
- 为什么我收到错误:"运算符<<不匹配?
- 迭代器类的重载前缀增量运算符会引发分段错误
- 在 boost::qi 中使用过多的替代运算符会导致分段错误
- 调用运算符时出现链接器错误<<,如何解决?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 解决错误:运算符 [] 不匹配
- 提升错误:"运算符=="的重载不明确
- 字符串输入中没有匹配的错误运算符错误
- 错误:运算符 = IN C++ 不匹配
- QT 创建器错误(运算符 + 不匹配)
- 错误C++运算符重载
- 错误:运算符==不匹配
- C++ 语法和编译器错误 - 运算符不匹配<<
- C++错误--运算符=不匹配