The thing with implicitly instantiated template is that the compiler doesn't know whether you actually meant to use a template function or a non-template function (since the instantiation is implicit)
If in the translation unit (that is , a source file after pre-compiling steps was done) you call a function without explicitly using template parameters,the compiler:
- Check in the translation unit whether there is non template function which comply with the function call.
- if such not exist , check translation unit if there is a template function which comply with the function call.
- if such not exist ... compilation error
So , that means that if there is a function call which you want it to link with some kind of template instantiation , the template definition must be in the same translation unit ,the compiler won't go and check it in other Translation units (unless you use export keyword , and even in that case , I am not sure how many compilers support this bizarre feature)