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;

もちろん、構造体オペラは明示的な代入関数を必要としません、そして

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

これは、copy ctor/assignment演算子がconst参照によってパラメーターを取得していないためです。それ以外の場合ans[i][j]=opera(a,b,c);、一時オブジェクトを使用すると作成され、C ++標準に従って、このオブジェクトの非定数参照を取得することはできません。したがって、使用する必要がありますopera(const opera& o);

于 2011-05-12T15:18:58.103 に答える