1)template <class T = int, class U = double> //compiles
2)template <class T, class U =double> //compiles
3)template <class T = int, class U> //fails
Why does 1 and 2 compile whereas 3 does not?
(3) is ill-formed because
C++03 [Section 14.1/11] says
If a template-parameter has a default template-argument, all subsequent template-parameters shall have a default template-argument supplied.
class = void and it'll solve your problem.