Re: Confused by refusal to expand template
On 03/23/2012 11:52 PM, H. S. Teoh wrote: Code: struct S { int f(K)(K x) { return 1; } void func(K)(inout(K) x) { auto h = f(x); } } void main() { S s; s.func("abc");// This is line 44 } This refuses to compile: test2.d(44): Error: template test2.S.func(K) does not match any function template declaration test2.d(44): Error: template test2.S.func(K) cannot deduce template function from argument types !()(string) Removing 'inout' fixes the problem. But I don't understand why. T You already brought this up IIRC. The IFTI matching algorithm is too weak. I think it should work.
Re: Confused by refusal to expand template
Am 23.03.2012 23:52, schrieb H. S. Teoh: Code: struct S { int f(K)(K x) { return 1; } void func(K)(inout(K) x) { auto h = f(x); } } void main() { S s; s.func("abc");// This is line 44 } This refuses to compile: test2.d(44): Error: template test2.S.func(K) does not match any function template declaration test2.d(44): Error: template test2.S.func(K) cannot deduce template function from argument types !()(string) Removing 'inout' fixes the problem. But I don't understand why. T I've never really used inout, but don't you need it also for the return-type? Furthermore you don't the the inout here, since this template does match const/immutable/nothing anyways.
Re: Confused by refusal to expand template
On 03/23/2012 11:58 PM, David wrote: Am 23.03.2012 23:52, schrieb H. S. Teoh: Code: struct S { int f(K)(K x) { return 1; } void func(K)(inout(K) x) { auto h = f(x); } } void main() { S s; s.func("abc"); // This is line 44 } This refuses to compile: test2.d(44): Error: template test2.S.func(K) does not match any function template declaration test2.d(44): Error: template test2.S.func(K) cannot deduce template function from argument types !()(string) Removing 'inout' fixes the problem. But I don't understand why. T I've never really used inout, but don't you need it also for the return-type? Not any more (DMD 2.059). See http://d.puremagic.com/issues/show_bug.cgi?id=7105 Furthermore you don't the the inout here, since this template does match const/immutable/nothing anyways. His intention probably is to prevent multiple instantiation of a template based on different constness.
Re: Confused by refusal to expand template
On Friday, 23 March 2012 at 23:01:43 UTC, Timon Gehr wrote: On 03/23/2012 11:58 PM, David wrote: Am 23.03.2012 23:52, schrieb H. S. Teoh: Code: struct S { int f(K)(K x) { return 1; } void func(K)(inout(K) x) { auto h = f(x); } } void main() { S s; s.func("abc"); // This is line 44 } This refuses to compile: test2.d(44): Error: template test2.S.func(K) does not match any function template declaration test2.d(44): Error: template test2.S.func(K) cannot deduce template function from argument types !()(string) Removing 'inout' fixes the problem. But I don't understand why. T I've never really used inout, but don't you need it also for the return-type? Not any more (DMD 2.059). See http://d.puremagic.com/issues/show_bug.cgi?id=7105 Furthermore you don't the the inout here, since this template does match const/immutable/nothing anyways. His intention probably is to prevent multiple instantiation of a template based on different constness. This is definitely a bug. I've filed it in bugzilla, and posted a pull to fix it. http://d.puremagic.com/issues/show_bug.cgi?id=7769