digitalmars.D.bugs - [Issue 10183] New: Eponymous template instance fails to match in parameter list of other templates
- d-bugmail puremagic.com (45/45) May 27 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10183
- d-bugmail puremagic.com (6/6) May 27 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10183
- d-bugmail puremagic.com (21/40) May 27 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10183
- d-bugmail puremagic.com (9/9) May 27 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10183
http://d.puremagic.com/issues/show_bug.cgi?id=10183 Summary: Eponymous template instance fails to match in parameter list of other templates Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: jakobovrum gmail.com --- Code: ---- struct A(T, Unused) { T t; } template B(T) { alias B = A!(T, void); } void foo(T)(A!T a) {} void main() { auto b = B!int(42); // OK, works foo(b); // NG - causes error } ---- Output: ---- test.d(18): Error: template test.foo does not match any function template declaration. Candidates are: test.d(12): test.foo(T)(A!(T) a) test.d(18): Error: template test.foo(T)(A!(T) a) cannot deduce template function from argument types !()(A!(int, void)) ---- Could be a duplicate, but I don't know what to search for. Does not appear to be a regression. The call to `foo` works when the second template parameter of A is removed. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 27 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10183 --- Thinking more about it, I guess this might not be meant to work. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 27 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10183 Kenji Hara <k.hara.pg gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALIDCode: ---- struct A(T, Unused) { T t; } template B(T) { alias B = A!(T, void); } void foo(T)(A!T a) {}The pattern A!T means that the template A has _exactly_ one type template argument.void main() { auto b = B!int(42); // OK, works foo(b); // NG - causes errorBut the type of b is A!(int, void), so it does not match to A!T during IFTI.}In this case, template function foo should have following signature. void foo(TL...)(A!TL a) {} // TL would be deduced to (int, void) or void foo(T, TL...)(A!(T, TL) a) {} // T would be deduced to int // TL would be deduced to (void) -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 27 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10183 --- Yeah, I noticed after posting. The problem with the amended caller code is that it leaks implementation details, as it were. It would be nice if there was a good way to solve this particular abstraction problem. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 27 2013