A template function is a way to operate with generic types (you may consider the type as an argument). Your template parameter T allows to pass different types to a function when you invoke the function (which means, simply said,  you may replace T with some other types int, double, ...)
Please, have a look at the following simple example.
#include <iostream>
#include <typeinfo>
// you may put it all in a hpp and thus include the hpp file in the CPP
template<typename T>
struct Integer
{
    T val;
    void setUint(const T &input){
        val=input;
        std::cout <<"the type is " << typeid(T).name() << " value is "<< val << std::endl;
    }
};
// or look at Jarod42's implementation details.
/*
template<typename T>
void Integer<T>::setUint(const T &input){
   val=input;
   std::cout <<"the type is " << typeid(T).name() << " value is "<< val << std::endl;
}*/
// and here you have your cpp calling you template function with different types
int main()
{
    Integer<double> value;
    value.setUint(1500000);
    Integer<int> value2;
    value2.setUint(5);
    
    return 0;
}