Well, no*.
To use any piece of code a translation unit needs to either compile it oneself or have access to a compiled version. One cannot compile all possible versions of a template class thus to use it a full definition is required.
.* Technically, if your class template will be used only for a couple of types then you could hide implementation in a .cpp and build all required versions in the same .cpp but it wouldn't be truely generic.
If you aren't happy with messy implementation you could hopefully implement the messy part in non-generic functions and hide those in a .cpp. Or, like in many header-only libraries, make namespace details
or something and push all the "implementation" details there.