Confused by refusal to expand template

Kenji Hara k.hara.pg at gmail.com
Sat Mar 24 23:54:29 PDT 2012


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


More information about the Digitalmars-d-learn mailing list