Several approaches:
- The export keyword could theoretically help, but it was poorly supported and was officially removed in C++11.
- Explicit template instantiation (see here or here) is the most straightforward approach, if you can predict ahead of time which instantiations you’ll need (and if you don’t mind maintaining this list).
- Extern templates, which are already supported by several compilers as extensions. It’s my understanding that extern templates don’t necessarily let you move the template definitions out of the header file, but they do make compiling and linking faster (by reducing the number of times that template code must be instantiated and linked).
- Depending on your template design, you may be able to move most of its complexity into a .cpp file. The standard example is a type-safe vector template class that merely wraps a type-unsafe vector of
void*; all of the complexity goes in thevoid*vector that resides in a .cpp file. Scott Meyers gives a more detailed example in Effective C++ (item 42, “Use private inheritance judiciously”, in the 2nd edition).