перегрузка 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, String) вместо метода opIndexAssign(String, JSObject).

Я неправильно определил функции opIndexAssign?

Заранее спасибо,


person Frederik    schedule 09.07.2011    source источник
comment
вы знаете, что псевдоним string (обратите внимание на маленькую s) уже существует (хотя он имеет псевдоним immutable char[])   -  person ratchet freak    schedule 09.07.2011
comment
да вроде тоже где-то читал. Но всякий раз, когда я пытаюсь, он, кажется, жалуется на это. Может быть, это потому, что я использую Tango?   -  person Frederik    schedule 10.07.2011
comment
ну, это может быть локально для фобоса, хотя я не уверен   -  person ratchet freak    schedule 10.07.2011


Ответы (1)


проблема в том, что 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);
}

причина, по которой это делается, заключается в том, что вы можете определить vararg для индекса

person ratchet freak    schedule 09.07.2011
comment
Варарг вещь умопомрачительная... Сам бы никогда не догадался :) - person vines; 10.07.2011