and hello is a template, the compiler must determine what type to be used, right ? So it checks what are the types of the arguments, and find int and double. Since both types would valid for this template function, it doesn't have any way to choose which type to use. That's why you must help the compiler by telling which type it should use:
hello<int>(1,1.0);
Previously you didn't have this fact, because the compiler knew only the hello function that use int, and that's it. It didn't know any hello with double as argument.