Compare the highest voted answer:
You would think that the compiler, when resolving overloaded function
templates, tries to figure out which of the templates matches the
given arguments better. Based on that assumption, a template with a
uint8_t should match a function call with a uint8_t argument better
than a template for int.
But that's not how template overload resolution works. [detailed
analysis follows, citing the language standard with explanations]
There have been many efforts here (also through other similar
questions) to understand, almost to justify why this happens, and it
might be that the standard specifically say that this is the correct
behaviour (but in a very tangled way).
My opinion is that [general description of problem follows, but no solution to OP's problem is offered]
The highest voted answer is... Well, it's an answer, and a very good, detailed one at that. Your "answer" reads more like a conversation. Many users who come from forum environments see this kind of conversation happen all the time, so while it might seem like a natural thing to do, we try to avoid that here.
Answers should be answers.