http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53573
--- Comment #3 from Keean Schupke <ke...@fry-it.com> 2012-06-04 13:44:14 UTC --- From: Technicalities C.13.8.3: " struct X { X(int); /* ... */ }; " " void g(X); " " template<class T> void f(T a) { g(a); } " " void h() " { " extern void g(int); " f(2); // invokes f(X(2)); that is, f<X>(X(2)) " } " " Here, the point of instantiation for f is just before h()... Note: just before "h()", not just before "template<class T>"