D opBinary () () ошибка перегрузки? - PullRequest
2 голосов
/ 29 декабря 2011

Когда я пытаюсь перегрузить opBinary для простой структуры Vector, я получаю странную и бессмысленную ошибку:

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)».Нет номеров строк, ничего.Что, очевидно, не дает мне много чего сделать.Есть ли другой способ справиться с этой ситуацией?Это известная ошибка?

Я использую DMD 2.057 в Windows 7. Еще не тестировал в Linux.

[EDIT] немного очистил код для удобства чтения.

1 Ответ

5 голосов
/ 29 декабря 2011

Полная ошибка:

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