[Bug c++/15674] [DR214] template argument binding differs between member and static fumctions
nathan at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Mon Jun 6 12:35:00 GMT 2005
------- Additional Comments From nathan at gcc dot gnu dot org 2005-06-06 12:35 -------
Closing this, it is not a bug. What special cases the structure member example
is that one of the function is a template and the other is not. Thus overload
resolution picks the non-template (all other things being equal). Template
specialization ordering never gets a look in.
If you try a completely non-templated example of
void Foo (int *);
void Foo (int (&)[5]);
you'll discover overload resolution considers this ambiguous. The lvalue
array->pointer transform being ignored in ranking the conversion sequences
(13.3.3.2]/3.
The case with both being template instantiations is the same wrt ranking the
conversion sequences, and template partial specialization does not get to
overrule that.
This leaves the members of S<int>, the pointer version
void S(T *);
although it uses a template parameter, is not a template function in its own
right (it has no template header), so in the context of an instantiation of S,
it is not a template. The other template
template <unsigned n> void S(T (&)[n])
though, is a template in its own right, and will defer to the other function in
overload resolution.
If you want to distinguish these functions, make the pointer one a reference to
pointer in both the non-template and template cases,
--
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |INVALID
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15674
More information about the Gcc-bugs
mailing list