Если класс шаблонный, то он должен быть весь быть в h (или hpp), и подключаться. Иначе он не скомпилирует. Т.е. отдельный cpp с реализацией методов он просто не может скомпилировать отдельно, т.к. не знает что это за класс T, параметр шаблона подставляется на этапе компиляции; и при разных T всё перекомпилируется (поэтому иногда, например, вместо передачи функции или функтора в виде superfunc (FUNC&& func), где FUNC это функция или объект с оператором (), можно пердать например superfunc (std::function меньше int(int) больше func), т.е. сделать нешаблонным, но иметь накладные расходы на посредник std::function, но машинный код будетсгенирован один раз и будет универсальным)