On 2014-01-09 21:27, H. S. Teoh wrote:
Yeah, that error drives me up the wall too. I often get screenfuls of errors, dumping 25 or so overloads of some obscure Phobos internal function (like toImpl) as though an end-user would understand any of it. You have to parse all the sig constraints (and boy some of them are obscure), *understand* what they mean (which requires understanding how Phobos works internally), and *then* try to figure out, by elimination, which is the one that you intended to match, and why your code failed to match it.I'm almost tempted to say that using sig constraints to differentiate between template overloads is a bad idea. Instead, consider this alternative implementation of toImpl: template toImpl(S,T) // N.B.: no sig constraints here { static if (... /* sig constraint conditions for overload #1 */) { S toImpl(T t) { // implementation here } } else static if (... /* sig constraint conditions for overload #2 */) { S toImpl(T t) { // implementation here } } ... else // N.B.: user-readable error message { static assert(0, "Unable to convert " ~ T.stringof ~ " to " ~ S.stringof); } } By putting all overloads inside a single template, we can give a useful default message when no overloads match.
If I recall correctly, Andrei has mentioned that something like the above doesn't works so well with __tratis(compile).
-- /Jacob Carlborg
