2011-07-09 6 views
4

私のクラスのいずれかでopIndexAssignのオーバーロードに問題があるようです。opIndexAssignのオーバーロード

私にはクラスがあります。このように定義されたJSObject:

alias char[] String; 

...

class JSObject : Dobject 
{ 
    /***************************************************************** 
    * Constructors 
    ******************************************************************/ 
    this(Dobject dobj) 
    { 
     super(dobj) ; 
    } 

    this() 
    { 
     super(null) ; 
    } 

    this(AssociativeArray data) 
    { 
     // initiate 
     super(null) ; 

     // then populate 
     foreach(k, v ; data) 
     { 
      this[ k ] = v ; 
     } 
    } 

    public void opIndexAssign(String key , String val) 
    { 
     Value* v = new Value() ; 
     v.putVstring(val) ; 
     this.Put(key, v , DontDelete); 
    } 

    public void opIndexAssign(String key , Dobject dobj) 
    { 
     Value* v = new Value() ; 
     v.putVobject(dobj) ; 
     this.Put(key, v , DontDelete); 
    } 

    public void opIndexAssign(String key , JSObject jso) 
    { 
     Value* v = new Value() ; 
     v.putVobject(jso) ; 
     this.Put(key, v , DontDelete); 
    } 

    public Value* opIndex(String key) 
    { 
     return this.Get(key); 
    } 

} 

DobjectのスーパークラスがオーバーロードしているPUT()とget()メソッドと私はので、私はそれらにアクセスすることができ、それらをラップしようとしています

77: JSObject jso = new JSObject() ; 
78: jso[ "foo" ] = "bar" ; 
79: 
80: JSObject jsoParent = new JSObject() ; 
81: jsoParent[ "child" ] = jso ; 

これはString、Stringメソッドで機能しますが、値としてJSObjectを使用しようとすると失敗します。

test2.d => test2 
+ c:\dmd\dsss\bin\rebuild.exe -version=PhobosCompatibility -w -Idsss_imports\ -I. -S.\ -Ic:\dmd\dsss\include\d -Sc:\dmd\dsss\lib\ -Ic:\dmd\dsss\include\d -Sc:\dmd\dsss\lib -oqdsss_objs\D -debug -gc test2.d -oftest2 
test2.d(81): Error: function dmdscripttest.JSObject.opIndexAssign (char[],char[]) does not match parameter types (JSObject,char[5u]) 
test2.d(81): Error: cannot implicitly convert expression (jso) of type dmdscripttest.JSObject to char[] 
test2.d(81): Error: cannot implicitly convert expression ("child") of type char[5u] to dmdscripttest.JSObject 
Error: Command failed, aborting. 
Command c:\dmd\dsss\bin\rebuild.exe returned with code 1, aborting. 

私は間違っていることに少し迷っています。これは、コンパイラがopIndexAssign(String、JSObject)メソッドの代わりにopIndexAssign(String、String)に適合するようにキャストしようとするようなものです。

opIndexAssign関数を誤って定義しましたか?事前に

おかげで、

+0

あなたは 'string'(小文字に注意してください)エイリアスが既に存在することを知っています(ただし' immutable char [] 'にエイリアスされています) –

+0

はい、私はそれもどこかで読んでいるようです。しかし、私が試してみると、それはそれについて文句を言うようです。私はタンゴを使用しているからでしょうか? – Frederik

+0

確かに私は確信していませんが、それはphobosのローカルかもしれません –

答えて

8

問題がopIndexAssigneが最初にして、キー(またはインデックス)の値を必要としていることである

http://www.d-programming-language.org/operatoroverloading.html#Assignment

ので、あなたが

としてそれを定義することをお勧めします
public void opIndexAssign( String val , String key) 
{ 
    Value* v = new Value() ; 
    v.putVstring(val) ; 
    this.Put(key, v , DontDelete); 
} 

public void opIndexAssign(Dobject dobj , String key) 
{ 
    Value* v = new Value() ; 
    v.putVobject(dobj) ; 
    this.Put(key, v , DontDelete); 
} 

public void opIndexAssign(JSObject jso , String key) 
{ 
    Value* v = new Value() ; 
    v.putVobject(jso) ; 
    this.Put(key, v , DontDelete); 
} 

これは、インデックスの可変幅を定義できるようにするためです

+0

vararg事は吹き荒れています...自分自身を推測したことはありません:) – vines

関連する問題