2

単純な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)"。行番号も、何もありません。これは明らかに私に多くのことを続けることを与えません。この状況に対処する別の方法はありますか?これは既知のバグですか?

Windows7でDMD2.057を使用しています。Linuxではまだテストしていません。

[編集]読みやすさのためにコードを少しクリーンアップしました。

4

1 に答える 1

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)

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")
        );
    }
}
于 2011-12-29T10:04:01.073 に答える