Здравствуйте, я пытаюсь узнать о явном создании экземпляров. И поэтому читая разные примеры, но в одном примере есть некоторые сомнения. Пример приведен ниже, и у меня есть 2 сомнения в этом конкретном примере.
Файл Application.cc содержит:
extern template int compare(const int&, const int&);
int i = compare(a1[0], a2[0]);// instantiation will appear elsewhere
Файл templateBuild.cc содержит:
template int compare(const int&, const int&);
Также обратите внимание, что сравнение шаблона функции:
template<typename T, typename F = less<T>>
int compare(const T &v1, const T &v2, F f = F())
{
if (f(v1,v2)) return -1;
if (f(v2,v1)) return 1;
return 0;
}
Мои вопросы заключаются в следующем:
- Как видите, в файле Application.cc во 2-й строке написано (в качестве комментария), что экземпляр появится в другом месте. Но здесь мы используем функцию шаблона как
int i = compare(a1[0], a2[0]);
, и мы знаем, что всякий раз, когда мы используем функцию шаблона, компилятор будет создавать ее экземпляр. Так почему же этот комментарий написан там? Также в пояснении написано, что
Когда компилятор видит определение экземпляра (в отличие от объявления), он генерирует код. Таким образом, файл templateBuild.o будет содержать определения для сравнения, созданные с помощью int.
Итак, мой вопрос: если компилятор генерирует код всякий раз, когда он видит определение экземпляра, и поэтому templateBuild.o будет содержать определение сравнения, созданное с помощью int, то как мы можем использовать compare() в файле Application.cc, используя compare(a1[0], a2[0]);
? Я имею в виду, что шаблон сравнения() еще не создан, так как мы можем использовать его до того, как он будет создан?
- Мой второй вопрос заключается в том, где я должен писать (помещать) содержимое шаблона compare(). Например в заголовочном файле или в файле Application.cc? Под содержимым шаблона compare() я подразумеваю 3-й блок кода, который я привел в примере.
extern
). Это объявление указывает компилятору, как генерировать машинный код для вызова функции, включая передачу аргументов и, возможно, чтение возвращаемого значения. Для выполнения этой задачи определение функции не требуется. - person Daniel Langr   schedule 30.04.2021f<int>
сгенерирован). Ваша книга кажется немного неточной. Я предполагаю, что это потому, что на практике в подавляющем большинстве случаев шаблоны не создаются явно. Кстати, что это за книга? - person Daniel Langr   schedule 30.04.2021