In c++, template<typename T> void F (T); template<typename T> void F (std::complex<T>); This doesn't work. I want the second overload to be the 'best' match for F (std::complex<double>) for example, but the standard doesn't agree. Never really made sense to me. What would D do?