D opBinary()() 重载错误?

发布于 2024-12-23 02:13:48 字数 863 浏览 2 评论 0原文

当我尝试在简单的 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 上进行测试。

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

When I try and overload opBinary on a simple Vector struct, I get a strange and meaningless error:

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

The error I get is simply: "opBinary(string op)". No line numbers, nothing. Which obviously doesn't give me a whole lot to go on. Is there another way to handle this situation? Is this a known bug?

I'm using DMD 2.057 on Windows 7. Haven't tested on Linux yet.

[EDIT] cleaned the code up a bit for readability.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月无声 2024-12-30 02:13:48

完整的错误是:

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

The full error is:

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 fails to parse it, causing the error you see. Are you using VisualD?

The code works if you change it to something like:

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")
        );
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文