Overload resolution is needed when there is more than one possible candidate when a function call is made. The compiler needs to determine which function it is actually calling; there is only one right answer. Generally, you can think of it being the more specific possible function that is chosen when looking at different templates/functions, but the exact rules are much more detailed.
I think the article you linked does a good job at boiling down the essentials.
The latter is not even considered a template at all, since the boost::optional template class is already instantiated with bool. Therefore, it is just a regular function that takes a regular class instance as a parameter.