У меня есть рабочий код с шаблоном. Подобно stl :: string, я в основном использую свой шаблон с одним параметром в нескольких единицах компиляции. Чтобы сэкономить время, я пытаюсь использовать extern instantiation . Однако изменение строк следующим образом приводит к ошибке. Как правильно это делать? (P.S. Компиляция на gcc с флагом c ++ 0x)
typedef myTemplate_base<commonType> myTemplate;
extern template class myTemplate_base<commonType>; //using "extern template myTemplate" wont work
Я добавил в проект дополнительный файл cpp со следующим.
template class myTemplate_base<commonType>;
Компоновщик выдает это сообщение об ошибке (указав строку первого экземпляра объекта ( myTemplate someVar;
) в основном файле как источник ошибки):
undefined reference 'myTemplate_base :: ~ myTemplate_base () '
Однако этот тип находится в классе со следующим определением ~ myTemplate () = default;
Изменить: Если у вас есть лучший заголовок, пожалуйста, прокомментируйте, так что правильный люди взглянут на это
Edit2: Есть забавная вещь, добавление класса шаблона myTemplate_base
значительно увеличивает размер исполняемого файла (+ 100 КБ для двоичного файла 450 КБ), хотя шаблон используется в основном (для компиляции я должен закомментировать часть extern
). Это намекает на то, что компоновщик хранит две реализации шаблона с одним и тем же экземпляром / я что-то упускаю.