[Issue 14756] cannot deduce function with template constraint
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Jul 1 18:46:23 PDT 2015
https://issues.dlang.org/show_bug.cgi?id=14756
Kenji Hara <k.hara.pg at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |INVALID
--- Comment #1 from Kenji Hara <k.hara.pg at gmail.com> ---
(In reply to Tim from comment #0)
This behavior change is an intentional bug fix. See issue 14290.
> enum bool isInstanceOf(alias S, T) = is(T == S!Args, Args...);
>
> struct Test(size_t id)
> {
> static void from(Other)(Other other)
> if (isInstanceOf!(Test, Other))
In here, 'Test' represents an instantiated struct, not a template. By fixing
issue 14290, is-expression won't match to the instantiation form S!Args when S
is a struct.
> If the template constraint uses the is-expression directly, the error goes
> away.
When you rewrite the condition as follows:
static void from(Other)(Other other)
if (is(Other == Test!Args, Args...))
'Test' is still a struct, but in here, the is-expression can recognize it may
also represent the outer template Test(size_t id) because it's accessible
through the lexical scope.
To fix the issue, you need to pass explicitly the template 'Test' to the
isInstanceOf.
struct Test(size_t id)
{
static void from(Other)(Other other)
if (isInstanceOf!(.Test, Other))
// <-- Use Module Scope Operator (http://dlang.org/module)
{}
}
--
More information about the Digitalmars-d-bugs
mailing list