D opBinary()()重载错误?

F i*_*i L 2 overloading d operator-overloading dmd

当我尝试在一个简单的Vector结构上重载opBinary时,我得到一个奇怪且毫无意义的错误:

struct Vector(T)
{
    T x, y;

    Vector opBinary(string op)(Vector!float vector)
    {
        return Vector (
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }

    Vector opBinary(string op)(Vector!double vector)
    {
        return Vector (
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }
}

void main()
{
    auto dVec = Vector!double();
    auto fVec = Vector!float();

    auto aVec = dVec + fVec; // Adding this line causes error (see below)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误很简单:"opBinary(string op)".没有行号,没有.这显然不会给我很多东西继续下去.还有另一种方法来处理这种情况吗?这是一个已知的错误?

我在Windows 7上使用DMD 2.057.还没有在Linux上测试过.

[编辑]清理了一些代码以提高可读性.

jA_*_*cOp 5

完整的错误是:

main.d(27): Error: template main.Vector!(double).Vector.opBinary(string op) opBinary(string op) matches more than one template declaration, main.d(5):opBinary(string op) and main.d(13):opBinary(string op)
Run Code Online (Sandbox Code Playgroud)

VisualD无法解析它,导致您看到的错误.你在使用VisualD吗?

如果您将代码更改为以下内容,代码将起作用:

struct Vector(T)
{
    T x, y;

    Vector opBinary(string op, U)(Vector!U vector) if(is(typeof(mixin("x" ~ op ~ "vector.x")) : T))
    {
        return Vector(
            mixin("x" ~ op ~ "vector.x"),
            mixin("y" ~ op ~ "vector.y")
        );
    }
}
Run Code Online (Sandbox Code Playgroud)