The following snippet: #include <iostream> void foo(){} template<typename T>void bar(){} template<typename T> void test(const T&) { std::cout<<typeid(T).name()<<std::endl; } int main() { test(&foo); test(&bar<int>); } produces this oputput on gcc version 3.2 20020927 (prerelease) under Cygwin: PFvvE FvvE But the two lines should be identical --in both cases, the deduced T should be void(*)(). Although it is not immediately apparent in the testcase provided, what happens is that the second type is taken as void(), i.e. the pointer somehow is dropped. Joaquín M López Muñoz Telefónica, Investigación y Desarrollo
Fixed (at least) in 3.3.3.