В общем, это означает, что компоновщик видит ссылку на символ, но он нигде не может его найти - часто из-за отсутствия библиотеки или объектного файла.
В в этом случае это произошло потому, что вы реализовали функции-члены вашего шаблонного класса в файле .cpp - они должны быть реализованы в заголовке.
Шаблонный класс - это шаблон , а не класс. Когда компилятор увидит вас, используя, например, vector<int> f;
создает новый класс vector<int>
из шаблона vector
. Например, чтобы создать vector<int>::size()
он должен видеть реализацию size()
в том месте, где создается экземпляр шаблона, и не может этого делать, если реализация size()
отсутствует в заголовочном файле.
Вы можете обойти это путем явного создания экземпляра vector
для int
- тогда компилятор увидит явное создание экземпляра при компиляции файла cpp. Это лишает смысла иметь шаблон - он будет использоваться только для типов, которые вы предварительно определяете с явной реализацией. Итак, короткая история, всегда полностью реализуйте шаблоны в заголовочных файлах.