[Issue 19365] operator overloading set of mixin template is not considered

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Dec 6 13:56:40 UTC 2018


https://issues.dlang.org/show_bug.cgi?id=19365

Adam D. Ruppe <destructionator at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |destructionator at gmail.com

--- Comment #1 from Adam D. Ruppe <destructionator at gmail.com> ---
That's not a bug, that's by design. It allows you to override an overload set
from a mixin template while keeping the other things.

To merge the sets, you use alias:

struct S {
    mixin Operators ops;
    int opBinary(string op: "*")(S rhs) {return 2;}
    alias opBinary = ops.opBinary;
}


However, while that works with every other case, with this one.... it is giving
me

Error: alias `ooooo.S.opBinary` conflicts with template ooooo.S.opBinary(string
op : "*")(S rhs) at ooooo.d(7)


So that *might* be a bug, it isn't merging specialized templates... I was going
to close this immediately, but maybe this specific thing is legit.

To work around that, offer a dispatcher function instead of an alias:


struct S {
    mixin Operators ops;
    int opBinary(string op: "*")(S rhs) {return 2;}
    int opBinary(string op)(S rhs) {
        // forward all others to the mixin
        return ops.opBinary!op(rhs);
    }
}


see for design:
https://dlang.org/spec/template-mixin.html#mixin_scope

--


More information about the Digitalmars-d-bugs mailing list