Шаблоны странно играют с моделью компиляции C ++, потому что они не являются исполняемым кодом - они шаблоны для исполняемого кода. Следовательно, стандартная модель разбиения класса на пару .h / .cpp не работает корректно для шаблонов.
Причина, по которой вы обычно разбиваете класс на файл .h с интерфейсом и файл .cpp с реализацией, заключается в том, что обычно файлы .cpp можно компилировать отдельно, ссылаясь на код, определенный в других файлах .cpp, потому что компоновщик соединит все ссылки после компиляции файлов. Поскольку все .cpp компилируются в объектные файлы, содержащие исполняемый код, все будет работать правильно.
Однако с шаблонами эта система выходит из строя. Если вы определите класс шаблона и затем поместите все реализации его функций-членов в файл .cpp, то когда компилятор скомпилирует этот файл, он не найдет никакого кода - просто templates для кода и т. Д. он не будет генерировать какой-либо объектный код для методов шаблона. Следовательно, во время компоновки вы получите ошибки для каждой функции-члена, которую вы пытались вызвать в классе шаблона, потому что нет доступного кода.
Я точно не знаю, является ли это причиной вашей конкретной ошибки, но из того, что вы описываете, похоже, что это так, особенно если вы изменили не шаблонный класс (возможно, разделенный на .h /.cpp) в шаблонный класс.
Чтобы решить эту проблему, традиционное решение C ++ состоит в том, чтобы просто иметь .h файл для шаблона без сопровождающего исходного файла. Вы можете сделать это, просто переместив весь код исходного файла в заголовок. Мне нравится помещать строку в маркировку заголовка, где интерфейс останавливается и начинается реализация, часто что-то вроде
/* * * * * Implementation Below This Point * * * * */
или
/* * * * * Here be Dragons * * * * */
Чтобы прояснить ситуацию немного.
Надеюсь, это поможет!