It is usually a good idea to put implementations in a separate file. However, it is reasonable to have the small functions inlined, therefore they need to be in the header anyway.
Note that inlining large functions usually reduces performance (as far as I've seen).
Compilers also mostly don't support putting templated code in a separate cpp file.
Edit: One more thing. You can put the code that needs to be in the header (for inlining or templates) in a separate file and include that at the end of the header file. That's for organizational purposes only: the preprocessor will just paste that file into the header. It may also have a different extension, for example "*.tpp" for template code implementations.