http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46719

--- Comment #8 from Jonathan Wakely <redi at gcc dot gnu.org> 2010-12-01 
01:51:06 UTC ---
(In reply to comment #6)
> I think I did a bad job describing the issue, and I think that it's still a
> problem. I'd like to clarify it if I can. The following code works:
> 
>     template <typename Return, typename... Args> 
>     int curry(function<Return(double)> func) // NOTE: double

Here, Args can never be deduced, so must be given explicitly.

>     { 
>         return 0; 
>     } 
> 
>     int f(double x) 
>     { 
>         return 0; 
>     } 
> 
>     int main() 
>     { 
>         curry<int, double>(f); 

Args... must be {double}
It is not possible to call curry() without giving all template args, so the
compiler knows that the only viable specialisation is where Args...=double


>     }
> 
> While this does not:
> 
>     template <typename Return, typename... Args> 
>     int curry(function<Return(Args...)> func) // NOTE: Args...

Here Args... appears in a parameter and can be deduced.

>     { 
>         return 0; 
>     } 
> 
>     int f(double x) 
>     { 
>         return 0; 
>     } 
> 
>     int main() 
>     { 
>         curry<int, double>(f); 
>     }
> 
> Even though the template parameter pack Args expands to double, GCC is unable
> to match f to the type function<int(double)> if I use Args..., where it was

How does it know the template parameter pack expands to double? Maybe it
expands to {double,T} and you want T to be deduced. Or maybe {double,T,U}

If you passed a function<int(double)> it could deduce Args, but passing f
requires a user-defined conversion to an unknown type, so deduction cannot
succeed.

Reply via email to