I stumbled across this while playing with operator overloading. Since they are now function templates, this becomes an issue.

struct Vector2(T)
{
        T x;
        T y;

        /// element-wise operations, +, -,
        Vector2 opBinary(string op)(ref Vector2 v)
        {
mixin("return Vector2!(T)( cast(T)(x " ~ op ~ " v.x), cast(T)(y " ~ op ~ " v.y) );");
        }

        /// operation with scalar
        Vector2 opBinary(string op)(int i)
        {
mixin("return Vector2!(T) ( cast(T)(x " ~ op ~ " i), cast(T)(y " ~ op ~ " i) );");
        }
}

This yields:
template instance opBinary!("+") matches more than one template declaration

Of course this can be circumvented by using
opBinary(string op, U:Vector2)(U v)
opBinary(string op, U:int)(U v)


But is this how it's supposed to be done? Couldn't the compiler detect that itself?

Reply via email to