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