operator-overloading - 重载 opIndexAssign

标签 operator-overloading d dmd

我似乎在我的一个类中重载 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 父类(super class)重载了 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 函数?

提前致谢,

最佳答案

问题是 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);
}

这样做的原因是你可以为索引定义一个可变参数

关于operator-overloading - 重载 opIndexAssign,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6634457/

相关文章:

c++ - 为什么在预期 T 或 T& 时定义重载运算符的任意返回类型是合法的

c++ - 运算符重载麻烦

c++ - 重载运算符的意外行为 "<<"c++

d - 如何为 rdmd (Windows) 设置输出目录?

d - 表达式是否忽略不可变/常量?

C++ 错误 : operator []: 2 overloads have similar conversions

exception - 你能捕获异常处理过程中抛出的异常吗?

范围构建模式

monodevelop - Mono-D DMD 编译器问题

pipe - D 编程 - 如何从 stdin 获取管道内容