1

我写一堂课

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);   

可以直接工作。

4

3 回答 3

5

当您想从临时分配时,您需要

  opera& operator=(opera const& tmp){

另一条线

opera tmp=opera(t.a,t.b,i);

是新对象的初始化,而不是赋值。

于 2011-05-12T15:16:39.690 回答
2
ans[a][b]= opera(t.a,t.b,i);

为什么编译不成功。

这会调用赋值运算符,这就是它无法编译的原因,因为从中创建的临时对象opera(t.a,t.b,i)不能绑定到赋值运算符参数中的非常量引用。您需要做的就是:

 opera& operator=(const opera & tmp)
                //^^^^ note this
于 2011-05-12T15:18:32.910 回答
0

那是因为您的复制 ctor/赋值运算符没有通过 const 引用获取其参数。否则,当您使用ans[i][j]=opera(a,b,c);临时对象创建时,并且根据 C++ 标准,您不能对该对象采取非常量引用。因此你需要使用opera(const opera& o);

于 2011-05-12T15:18:58.103 回答