Since ResourceHolder is not a class, but a class template, the whole definition (including member function definitions) has to be available in the header file. Don't use a .cpp file. A typical way to separate header and implementation for templates is to provide a .hpp file as usual, and include the implementation at the end, in the form of a .inl file.