This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/14500] most specialized function template vs. non-template function
- From: "gdr at integrable-solutions dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 9 Mar 2004 07:13:25 -0000
- Subject: [Bug c++/14500] most specialized function template vs. non-template function
- References: <20040309045153.14500.bkoz@gcc.gnu.org>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Additional Comments From gdr at integrable-solutions dot net 2004-03-09 07:13 -------
Subject: Re: New: most specialized function template vs. non-template function
"bkoz at gcc dot gnu dot org" <gcc-bugzilla@gcc.gnu.org> writes:
| While working on c++/13658, I ran into divergent behavior between
| icc 7.1 and g++.
|
| I think g++ is wrong, and that in the code below, the explicitly specialized
| function template is the most specialized function, and should be called.
It looks to me that this is an interaction between "strong using" and
specializations: The most specialized swap() (for vector<>) leaves in
__gnu_norm:: whereas the most general leaves in std::. Therefore, when
you explicitly specialize, the compiler just considers the template in
std:: and forgets about the other one in __gnu_norm::; therefore it
thinks that you're specializing the one in std::. Which is wrong.
It should have collected all swap() reachable through strongly used
namespaces. (Recall that strong using says for all purposes except
mangling, everything is the same).
| By removing the template specialization syntax (ie "template<>"), and trying
| again, I get something that is considered the most specialized. But, why this
| and not the other?
When you remove the explicit specialization marker, you're overloading
with an *ordinary* function and overload resolution prefers
non-templates over templates when given equal chances.
-- Gaby
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14500