2012-01-31 14 views
3
struct A{ 

    int[3] _data; 

    ref int opIndex(size_t i) { return _data[i]; } 

    int opIndex(size_t i) const{ return _data[i]; } 
} 

T fun(T)(const ref T a){ 

    T ai = a; 
    swap(ai[0], ai[1]); // error 
    return ai; 
} 

immutable A a = A(); 
immutable A b = fun(a); 

void main(){ } 

上記のコードは次のエラーを与える:opIndexの適切な実装とは何ですか?

Error: ai.opIndex(0LU) is not an lvalue 
Error: ai.opIndex(1LU) is not an lvalue 
     called from here: fun(a) 

aiaのコピーであり、それは左辺値であるので、私はエラーを取得する理由を私は理解していません。

答えて

2

割り当てのためにopIndexの代わりにopIndexAssignを使用する必要があるため、ref int opIndex(size_t i)の代わりにint opIndexAssign(int value, size_t i)を使用してください。

あなたはここで詳細を見つけることができます:Operator Overloading

EDIT:

import std.algorithm; 

struct A{ 

    int[3] _data; 

    ref int opIndex(size_t i) { return _data[i]; } 
} 

T fun(T)(){ 
    T ai; 
    // swap(ai._data[0], ai._data[1]); 
    swap(ai[0], ai[1]); 
    return ai; 
} 

immutable A a = A(); 
immutable A b = fun!(A); 

void main(){ } 
+0

割り当てがありますか? – Arlen

+0

ああ、私は、スワップを忘れて、参照してください。あなたが実際のエラーを取得しないようで、スワップのコメントを外してみてください。新しいエラーが出ます: 'エラー:静的変数はコンパイル時に参照できません.'これは実際の問題です。さらに 'T ai = a;'はあなたに不変の構造体を与えます。 – dav1d

+0

まあ、 'T ai = a;'は不変のものを与えるべきではありません。そのように振る舞わないようにするにはどうしてですか? – Arlen

関連する問題