Я вручную указал, какие классы будут использоваться в исходном файле, но это очень неприятно:
A<int>; // manually trigger code generation for int and double
A<double>;
Это недопустимо (я предполагаю, что вы хотели объявить фиктивныйПеременные здесь и пропустили их имя).Ниже мы увидим, почему
Есть ли что-то стандартное, что было предписано, и / или g ++ поддерживает что-то подобное?
C ++ 03 имел что-то под названием export
, но это оказалось ошибкой.EDG реализовала эту функцию, и их опыт показал, что ее реализация не стоит того.И он не предоставляет полезной функции, которую обычно дает отдельная компиляция: Скрытие кода шаблонов, который вы когда-то компилировали.export
все еще требуется код шаблонов, будь то в необработанном виде или закодированный на языке компилятора среднего уровня.См. Почему мы не можем позволить себе экспорт .Короткий пример приведен работником EDG Дэвидом Вандеворде здесь .
Для C ++ 0x и для экспорта без C ++ 0x мы имеем
Aшаблон функции, функция-член шаблона класса или статический член данных шаблона класса должны быть определены в каждой единице перевода, в которой он неявно создается (14.7.1), если в какой-то части не определена соответствующая специализация (14.7.2) в некоторыхпереводческий блок;Диагностика не требуется
Как видно, единственный способ добиться отдельной компиляции - это явное создание экземпляра шаблона, который вы хотите отдельно скомпилировать.Определяя фиктивные переменные, вы просто неявно создаете экземпляр шаблона класса.И вы не создаете экземпляры функций-членов шаблонов классов таким образом - вам нужно было бы сделать фиктивные вызовы или взять их адрес.И ко всему этому вы не гарантированы, что неявно созданная экземплярная функция не будет отброшена, если она не используется в модуле перевода, которым она была создана после оптимизации, на основании приведенной выше цитаты.
Таким образом, вы явно создаете экземпляр шаблона класса, который также явно создает экземпляры его функций-членов следующим образом:
template class A<int>;
template class A<double>;