Шаблон C++, связывая ошибку [дубликат]

[[ ]] имеет больше функций - я предлагаю, чтобы Вы смотрели на Усовершенствованное Руководство по созданию сценариев Bash для большего количества информации, конкретно расширенный тестовый раздел команды в Глава 7. Тесты .

Кстати, поскольку руководство отмечает, [[ ]] был представлен в ksh88 (версия 1988 года оболочки Korn).

34
задан sth 30 August 2009 в 14:30
поделиться

5 ответов

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

62
ответ дан 27 November 2019 в 16:20
поделиться

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

9
ответ дан 27 November 2019 в 16:20
поделиться

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

6
ответ дан 27 November 2019 в 16:20
поделиться

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

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

Array<int> arr1;

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

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

Array<double> arr2;

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

Если вам нужен C ++ для работы с любым типом , который вам может понадобиться в будущем,

5
ответ дан 27 November 2019 в 16:20
поделиться

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

1
ответ дан 27 November 2019 в 16:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: