In the following code, adapted from gmpxx, the output is HELLO2. If however I change the order of the two partial specializations, the output becomes HELLO1. At least one other compiler I tried outputs HELLO1 in both cases. I know that I can remove the "template<>" and overload the function instead of partially specializing it, but I would like to understand why the current code is failing.
#include <iostream> struct mpz_t{}; template <class T, class U> class __gmp_expr{}; template <class T, class U> void __gmp_set_expr(const __gmp_expr<T, U> &); typedef __gmp_expr<mpz_t, mpz_t> mpz_class; template <> void __gmp_set_expr(const __gmp_expr<mpz_t, mpz_t> &expr) { std::cerr << "HELLO1\n"; } template <class T> void __gmp_set_expr(const __gmp_expr<mpz_t, T> &expr) { std::cerr << "HELLO2\n"; } int main(){ mpz_class a; mpz_t t; __gmp_set_expr(a); } -- Summary: partial specialization of function depends on the order Product: gcc Version: 4.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: marc dot glisse at normalesup dot org GCC host triplet: i486-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37066