This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: g++ 2.95.2 cannot resolve a return-type template function overload
- To: sebor at my-Deja dot com, "Martin v. Loewis" <martin at loewis dot home dot cs dot tu-berlin dot de>
- Subject: Re: g++ 2.95.2 cannot resolve a return-type template function overload
- From: " " <sebor at my-Deja dot com>
- Date: Fri, 28 Jan 2000 09:12:54 -0800
- Cc: gcc-bugs at gcc dot gnu dot org, pedretti at roguewave dot com
- Organization: My Deja Email (http://www.my-deja.com:80)
On Fri, 28 Jan 2000 10:46:18 Martin v. Loewis wrote:
>> the program below gives an error with g++ 2.95.2. I believe since
>> the second foo<>() matches exactly it is a "better match" than the
>> first foo<>(). The program compiles fine with edg 2.42.
>
>Thanks for your bug report. I believe this is an error in your code
>(and a bug in edg, unless it is diagnosed as an extension).
>
>First, template argument deduction succeeds for both templates, so
>they are both candidates. The conversion sequences for the arguments
>are identical, so 'partial ordering' must be considered.
>
>Here's the relevant text from 14.5.5.2, [temp.func.order]
>
># The transformation used is:
># - For each type template parameter, synthesize a unique type and
># substitute that for each occurrence of that parameter in the
># function parameter list, or for a template conversion function, in
># the return type.
># - For each non-type template parameter, [we don't have any]
># - For each template template parameter, [we don't have any]
>
># Using the transformed function parameter list, perform argument
># deduction against the other function template. The transformed
># template is at least as specialized as the other if, and only if,
># the deduction succeeds and the deduced parameter types are an exact
># match (so the deduction does not rely on implicit conversions).
>
>So we choose the first template, and synthesize unique types t, and
>u. We perform template argument deduction of foo(u) against the other
>template. This fails, since we cannot deduce a type for T.
>
>Now, the other way round. We synthesize a unique type t, and perform
>deduction of foo(int) against the other template. This gives us U=int,
>but T cannot be determined.
>
But T, which is the only parameter of the second template, is explicitly specified in the call to foo<int>(0), so the second foo specialized on int with an int argument _is_ an exact match for the call. Otherwise there's no way to call the second foo.
Martin
>So neither template is at least as specialized as the other, and the
>call is ambiguous.
>
>Regards,
>Martin
>
--== Sent via Deja.com http://www.deja.com/ ==--
Share what you know. Learn what you don't.