operator-overloading - D opBinary()() 重载错误?

标签 operator-overloading overloading d 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)
}

我得到的错误很简单:“opBinary(string op)”。没有行号,什么都没有。这显然并没有给我很多继续下去的机会。还有其他方法可以处理这种情况吗?这是一个已知的错误吗?

我在 Windows 7 上使用 DMD 2.057。尚未在 Linux 上进行测试。

[编辑]对代码进行了一些清理以提高可读性。

最佳答案

完整的错误是:

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)

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")
        );
    }
}

关于operator-overloading - D opBinary()() 重载错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8664421/

相关文章:

c++ - boost::static_visitor 未能专门化具有多种不同可能类型的函数模板

c++ - 运算符重载警告

c++ - 如何在自定义类实例上执行 cmath 函数?

c# - 有什么方法可以显示特定的自定义重载运算符的作用吗?

python - 关联矩阵?

regex - 在 D 中的编译时评估正则表达式

c++ - 如何重载 operator= 以返回指向成员的指针?

C++ 运算符== 重载

C++函数重载不明确

D - GDC 更友好的 asm 语法糖 (Dlang)