我写了一个课
struct opera{
int a,b;
int op;
opera(int a1=0,int b1=0,int op1=-1):a(a1),b(b1),op(op1){}
opera& operator=(opera& tmp){
a=tmp.a;
b=tmp.b;
op=tmp.op;
}
我想将它分配给这样的数组元素:
ans[a][b]= opera(t.a,t.b,i);
为什么它无法成功编译。
然而,这可行:
opera tmp=opera(t.a,t.b,i);
ans[a][b]= tmp;
当然,struct opera不需要显式赋值函数,而且
ans[a][b]= opera(t.a,t.b,i);
可以直接使用。
答案 0 :(得分:5)
如果您想从临时分配,则需要
opera& operator=(opera const& tmp){
另一行
opera tmp=opera(t.a,t.b,i);
是新对象的初始化,而不是赋值。
答案 1 :(得分:2)
ans[a][b]= opera(t.a,t.b,i);
为什么无法成功编译。
调用赋值运算符,这就是无法编译的原因,因为opera(t.a,t.b,i)
创建的临时对象不能绑定到赋值运算符参数中的非const引用。您需要做的就是:
opera& operator=(const opera & tmp)
//^^^^ note this
答案 2 :(得分:0)
这是因为你的copy ctor / assignment运算符没有通过const引用获取它的参数。否则,当您使用ans[i][j]=opera(a,b,c);
创建临时对象时,根据C ++标准,您不能为此对象采用非const引用。因此,您需要使用opera(const opera& o);