Difference between "can call" and "can compile"
snarwin at gmail.com
Tue Sep 15 11:26:32 UTC 2020
On Tuesday, 8 September 2020 at 20:04:32 UTC, Steven
> Here's what it says when there is no constraint (and when I
> actually call fun inside use):
> onlineapp.d(9): Error: undefined identifier oops
> onlineapp.d(4): Error: template instance onlineapp.bad!() error
> onlineapp.d(20): instantiated from here: use!(bad)
> This is what I want it to do. Why can't it just do that? Why do
> I need to see 10 more or even 5 more lines of irrelevant error
It sounds to me like your problem is that template constraints
are doing the exact thing they're designed to do: causing errors
that would otherwise be reported inside a template to be reported
outside of it.
Re: irrelevant error messages, I think they're unavoidable in the
general case. What if there are multiple template overloads? Only
one of them is going to have the error you care about, but the
compiler has no way to know which one. And likewise with static
if and static assert statements inside the template body.
The optimal solution to this problem, from a
programming-language-theory perspective, is a system like Rust's
traits that allows the compiler to type-check generic code prior
to instantiation. Since we don't have that, we're going to have
to settle for something "good enough."
More information about the Digitalmars-d