Я не буду расписывать все проблемы данного кода, остановлюсь на главном:
Function1 объявлена как принимающая 2 аргумента одного типа. Во втором и третьем случае вы вызываете её подсунув аргументы разных типов. Соответственно компилятор не может решить, чем будет T в данной ситуации - double или int, char или int? Либо делайте 2 шаблонных типа, либо делайте 2й аргумент нешаблонный, либо передавайте аргументы одного типа, либо явно говорите функции при вызове, чем является T.
Вторая проблема, не дающая собрать код, это противоречащие объявления этой функции - в одном случае аргумент по умолчанию есть, во втором - нет.