Bug 3177 – constrained template reverse operator overload prohibits use of non-reverse overloads

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Linux
Creation time
2009-07-15T02:12:00Z
Last change time
2015-06-09T01:28:07Z
Assigned to
nobody
Creator
kamm-removethis

Comments

Comment #0 by kamm-removethis — 2009-07-15T02:12:46Z
struct imaginary {} struct complex { complex opAdd(complex s) { return this; } complex opAdd_r(T)(T t) if (is(T == imaginary)) { return this; } } void main() { complex s; s = s + s; } yields the error Error: template complex.opAdd_r(T) if (is(T == imaginary)) does not match any function template declaration Error: template complex.opAdd_r(T) if (is(T == imaginary)) cannot deduce template function from argument types !()(complex) even though opAdd_r is only defined for T == imaginary. This may be by design: calling a constrained template function with template arguments that don't satisfy the constraints also doesn't give you an "undefined identifier" error, but rather a message like the one above, mentioning the function template declaration. However, it makes using constrained templates for operator overloading impossible. I'd expect a non-matching template operator overload to be ignored if there are other matches.
Comment #1 by andrej.mitrovich — 2012-01-21T18:01:32Z
Can't reproduce in 2.057, likely fixed by now.