/* ------- test case -------------------*/ void x(); template <typename T> void foo(const T*); int main() { foo(x); } GCC 4.5 complains: a.cpp: In function 'int main()': a.cpp:6: error: no matching function for call to 'foo(void (&)())' It seems that, const T * is resolved as void (&)()); IMO, T --> void (), const T --> void (), const T * --> void (*)(), and it should be leagle. Thanks