Подтвердить что ты не робот

Шаблон С++, связанная ошибка

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

В файле .hpp:

template <typename T>
class Array
{
public:
   Array();
};

В файле .cpp:

template <typename T>
Array<T>::Array()
{
//Do something
}

В основном:

Array<int> arr;

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

Любая идея?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 4

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

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

Array<int> arr1;

до конца вашего файла Array.cpp, и это делает компилятор инстанцировать правильное определение, которое ищет компоновщик. Тем не менее, это обеспечивает только одно определение Array<int> и другое.

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

Array<double> arr2;

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

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

Ответ 5

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

Ответ 6

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