Шаблон C ++, ссылка на ошибку

У меня проблема с вызовом classа шаблона, который у меня есть. Я объявил новое имя типа Array, которое является шаблоном;

В файле .hpp:

template  class Array { public: Array(); }; 

В файле .cpp:

 template  Array::Array() { //Do something } 

В основном:

 Array arr; 

Я получаю ошибку Linkage: неразрешенный внешний символ для ctor.

Есть идеи?

    Функции шаблонов, включая функции-члены, должны быть полностью записаны в файлах заголовков. Это означает, что если у вас есть class шаблона, его реализация должна быть полностью в файле заголовка. Это связано с тем, что компилятор должен иметь доступ ко всему определению шаблона (а не только к сигнатуре), чтобы генерировать код для каждого экземпляра шаблона.

    Поместите как объявление шаблона, так и определения функции шаблона в файл заголовка. Большинство компиляторов C ++ не поддерживают отдельную модель компиляции для шаблонов,

    Если определение шаблонной функции не отображается в том месте, где оно используется (т. Е. Не находится в заголовке или в том же файле CPP), вам нужно сообщить компилятору, какие экземпляры должны быть сделаны .

    Проблема, которую вы имеете здесь, заключается в том, что вы скрыли определение конструктора в файле .cpp. Это определение применяется ко всем типам T , включая T как int которые вы используете, но на самом деле не предоставляет никаких определений, потому что это все еще только декларация.
    Компилятор не может найти символ Array::Array() .

    Теперь вы можете добавить строку следующим образом:

     Array arr1; 

    до конца вашего файла Array.cpp, и это заставляет компилятор создавать правильное определение, которое ищет компоновщик. Однако это только одно определение – определение Array и другое.

    Это решение будет работать до тех пор, пока вам не понадобится Array другого параметра шаблона, скажем, double , после чего вам нужно будет добавить:

     Array arr2; 

    до конца вашего файла Array.cpp – теперь вы можете видеть, как это неустойчиво!

    Если вам понадобится C ++ для работы с любым типом, который вам может понадобиться в будущем, настало время переместить определение ctor (и, предположительно, всех других функций-членов) в заголовок (и удалить файл .cpp как он в нем ничего не останется).

    Как уже упоминалось выше, в шаблонах на C ++ процесс новых методов выполняется компилятором во время компиляции, проблема в том, что он должен знать все определение thm за это время, поэтому все объявления classа / функции должны быть ar h или hpp файлы.

    Другой ответ, скомпилируйте только ваш .cpp-файл (не основной) и проверьте размер объектного файла, затем создайте файл empty.cpp, затем скомпилируйте этот файл empty.cpp. наконец, сравните размер обоих объектных файлов. Вы увидите, что они имеют тот же размер, что означает, что ваш .cpp-файл не является компилятором, поэтому компоновщик ничего не может найти.

    Давайте будем гением компьютера.