http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40127
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-01-15 23:16:53 UTC --- (In reply to comment #0) > I'm not sure whether argument types can be bound from default arguments in the > standard, They can't. > but if they can't then I should get a diagnostic at the declaration > of the template. As Andrew showed, the template isn't invalid and can be called with an explicit template argument list, so issuing a diagnostic at declaration would be wrong. > The actual message is cryptic and unhelpful. Current versions give a great diagnostic: c.cc: In function ‘int main()’: c.cc:4:14: error: no matching function for call to ‘foo(int)’ c.cc:4:14: note: candidate is: c.cc:2:9: note: template<class T> void foo(int, void (*)(T*), T*) c.cc:2:9: note: template argument deduction/substitution failed: c.cc:4:14: note: couldn't deduce template parameter ‘T’