[Bug c++/14500] New: most specialized function template vs. non-template function
Gabriel Dos Reis
gdr@integrable-solutions.net
Tue Mar 9 07:13:00 GMT 2004
"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
More information about the Gcc-bugs
mailing list