IFTI Bug

Kramer Kramer_member at pathlink.com
Sun Jul 9 22:26:21 PDT 2006


Kirk McDonald wrote:
> Kramer wrote:
>> Kirk McDonald wrote:
>>
>>> Kramer wrote:
>>>
>>>> I imagine this should work.  The factorial code is straight from the 
>>>> docs.
>>>>
>>>> import std.stdio;
>>>>
>>>> void main()
>>>> {
>>>>     writefln(factorial(2));
>>>> }
>>>>
>>>> template factorial(int n)
>>>> {
>>>>   static if (n == 1)
>>>>     const factorial = 1;
>>>>   else
>>>>     const factorial = n * factorial!(n-1);
>>>> }
>>>>
>>>> C:\code\d\src>dmd template_ex_1.d
>>>> template_ex_1.d(8): template template_ex_1.factorial(int n) is not a 
>>>> function template
>>>> template_ex_1.d(5): template template_ex_1.factorial(int n) cannot 
>>>> deduce template function from argument types (int)
>>>>
>>>> -Kramer
>>>
>>>
>>> You need to instantiate the template with a bang:
>>>
>>> void main() {
>>>     writefln(factorial!(2));
>>> }
>>>
>>> IFTI only applies to function templates, which this is not.
>>>
>>
>> Thanks.  I knew about the bang, but figured IFTI would be able to 
>> handle this and would consider this a function so I thought it might 
>> work.  I haven't worked with D in a while, so is there any reason why 
>> this isn't considered a function template?  What would I need to do so 
>> IFTI would be invoked?
>>
>> Thanks in advance.
>>
>> -Kramer
> 
> Function templates accept both runtime and compile-time parameters. This 
> factorial template accepts only a single integer literal (which in this 
> case is a compile-time parameter). It is just a templated integer 
> constant, not a function.
> 
> A function template using IFTI might look something like this:
> 
> T func(T)(T t) {
>     return t * 2;
> }
> 
> We can explicitly instantiate the template and call the function like this:
> 
> writefln(func!(int)(20));
> 
> Or IFTI can derive the type of the function argument for us:
> 
> writefln(func(20));
> 

Ahhh, got it.  Thanks for the explanation; that helps a lot.



More information about the Digitalmars-d-bugs mailing list