IFTI Bug

Kirk McDonald kirklin.mcdonald at gmail.com
Sun Jul 9 22:23:17 PDT 2006


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));

-- 
Kirk McDonald
Pyd: Wrapping Python with D
http://dsource.org/projects/pyd/wiki



More information about the Digitalmars-d-bugs mailing list