Thread overview
Template argument deduction is too strict
Oct 21, 2008
Lars Kyllingstad
Oct 22, 2008
Walter Bright
Oct 22, 2008
Lars Kyllingstad
October 21, 2008
The function template
    void foo(A)(A a, real b) { ... }
is matched by
    foo(1, 1.0L);
but not by
    foo(1, 1.0);
since the second argument is a double literal.

I think the latter should also work, since it would work for a non-templated function. Don't you agree? :)

I am using D1, by the way. Is it the same in D2?

-Lars
October 21, 2008
On Tue, Oct 21, 2008 at 9:07 AM, Lars Kyllingstad <public@kyllingen.nospamnet> wrote:
> The function template
>    void foo(A)(A a, real b) { ... }
> is matched by
>    foo(1, 1.0L);
> but not by
>    foo(1, 1.0);
> since the second argument is a double literal.
>
> I think the latter should also work, since it would work for a non-templated function. Don't you agree? :)
>
> I am using D1, by the way. Is it the same in D2?
>
> -Lars
>

It's a bug that Walter tried to fix a while ago, didn't get right, and as far as I know _still_ hasn't gotten right.
October 22, 2008
Lars Kyllingstad wrote:
> The function template
>     void foo(A)(A a, real b) { ... }
> is matched by
>     foo(1, 1.0L);
> but not by
>     foo(1, 1.0);
> since the second argument is a double literal.
> 
> I think the latter should also work, since it would work for a non-templated function. Don't you agree? :)
> 
> I am using D1, by the way. Is it the same in D2?

The code:

void foo(A)(A a, real b) {  }

void test()
{
    foo(1, 1.0);
}

compiles with both D1 and D2.
October 22, 2008
Walter Bright wrote:
> Lars Kyllingstad wrote:
>> The function template
>>     void foo(A)(A a, real b) { ... }
>> is matched by
>>     foo(1, 1.0L);
>> but not by
>>     foo(1, 1.0);
>> since the second argument is a double literal.
>>
>> I think the latter should also work, since it would work for a non-templated function. Don't you agree? :)
>>
>> I am using D1, by the way. Is it the same in D2?
> 
> The code:
> 
> void foo(A)(A a, real b) {  }
> 
> void test()
> {
>     foo(1, 1.0);
> }
> 
> compiles with both D1 and D2.

Ok, must be that I'm using an outdated compiler, then. I am using 64-bit Linux, so I have to use GDC. (Right?)

-Lars