Ordinarily, I don't have to slice an array to treat it as a range. However, when passing it as template alias parameter, it seems like I do:
---
enum test(alias fun) = "it works";
immutable a = [1,2,3];
pragma(msg, test!(a[].map!(x => x))); // OK
pragma(msg, test!(a.map!(x => x))); // map is not a member of a
pragma(msg, test!(map!(x => x)(a))); // OK (no UFCS)
// but a.map does work at runtime ...
unittest {
auto r = a.map!(x => x);
}
---
Comment #1 by gassa — 2018-05-25T23:19:00Z
Still does not work in 2.080 release.
The error message however is interesting.
Here is a modified example with a line containing `(a)` instead of `a`.
Compile with `dmd -main`:
-----
import std.algorithm;
enum test(alias fun) = "it works";
immutable a = [1,2,3];
pragma(msg, typeof(a)); // immutable(int[])
pragma(msg, test!((a).map!(x => x))); // "it works"
pragma(msg, test!(a.map!(x => x))); // template identifier `map` is not a member of variable `a.a`
-----
Why is that `a.a` in the first place?
Does the compiler mistake `a` for an eponymous template somehow, instead of seeing that `map` is a template here?
Comment #2 by robert.schadek — 2024-12-13T18:47:21Z