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