Так зачем писать одну и ту же функцию для нескольких типов, если можно написать один шаблон?
Там скорее всего одна функция для одного типа, к примеру std::string, и компиляция этой функции приведёт к инстанциированию std::string. А если единица трансляции не использует std::string и ту функцию, то шаблонная функция не будет инстанциирована, а вместе с ней и std::string. А нешаблонная функция в хедере всегда будет инстанциировать типы, которые используются в её теле.