//
extern template class Blob
extern template int compare(const int&, const int&);
Blob
//
//
Blob
Blob
//
int i = compare(a1[0], а2[0]); //
Файл Application.o
будет создавать экземпляр класса Blob
наряду с его конструктором initializer_list
и конструктором копий. Экземпляры функции compare
и класса Blob
не будут созданы в этом файле. Определения этих шаблонов должны быть в каком-то другом файле программы:
//
//
//
template int compare(const int&, const int&);
template class Blob
//
В отличие от объявления, когда компилятор видит определение экземпляра, он создает код. Таким образом, файл templateBuild.o
будет содержать определения функции compare()
для экземпляра типа int
и класса Blob
. При построении приложения следует скомпоновать файл templateBuild.o
с файлом Application.o
.
Определение экземпляра для шаблона класса создает экземпляры всех членов этого шаблона, включая встраиваемые функции-члены. Когда компилятор видит определение экземпляра, он не может знать, какие функции-члены использует программа. Следовательно, в отличие от обычного способа создания экземпляра шаблона класса, компилятор создает экземпляры всех членов этого класса. Даже если член класса не будет использоваться, его экземпляр будет создан все равно. Следовательно, явное создание экземпляра можно использовать только для таких типов, которые применимы со всеми членами данного шаблона.
Упражнение 16.25. Объясните значение этих объявлений:
extern template class vector
template class vector
Упражнение 16.26. Предположим, что класс NoDefault
не имеет стандартного конструктора. Можно ли явно создать экземпляр vector
? Если нет, то почему?
Упражнение 16.27. Объясните по каждому помеченному оператору, происходит ли создание экземпляра. Если создается экземпляр шаблона, объясните, почему; если нет, то тоже почему.
template
void f1(Stack
class Exercise {
Stack
Stack
};
int main() {
Stack
f1(*sc); // (e)
int iObj = sizeof(Stack
}
Библиотечные типы интеллектуальных указателей (см. раздел 12.1) являются хорошим примером грамотно спроектированных шаблонов.
Очевидное различие между указателями shared_ptr
и unique_ptr
в стратегии, которую они используют для управления содержащимися в них указателями: один класс предоставляет совместную собственность; а другой — единоличною собственность на хранимый указатель. Это различие и является основанием для создания данных классов.