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