template <class T> class Hola { public: T a, b; Hola(const T a0, const T b0) : a(a0), b(b0) {} }; template <class T> Hola<T> operator * (const Hola<T> &h, const T c) { return Hola<T>(h.a*c, h.b*c); } template <class T> Hola<T> adios(const T a, const T b) { Hola<T> h(a, b); return h*2; // 13.3 Overload resolution [over.match] // 13.3.2 Viable functions [over.match.viable] // 13.3.3.1 Implicit conversion sequences [over.best.ics] // 13.3.3.1.1 Standard conversion sequences [over.ics.scs] // 4.9 Floating-integral conversions [conv.fpint] } int main() { Hola<double> h = adios(1.0, 2.0); return 0; }