Требуются ли явные объявления создания экземпляров шаблона в заголовке при явном создании определений в исходном файле? - PullRequest
0 голосов
/ 28 июня 2018

В этом вопросе принятый ответ включает шаблонную функцию объявление в заголовочном файле, в исходном файле которого есть определение . Чтобы сделать эту функцию шаблона также пригодной для использования в других единицах перевода, в исходном файле создаются явные экземпляры шаблона для каждого «разрешенного» использования. Пока это представляется мне стандартной практикой.

Однако в ответе также рекомендуется поместить соответствующий явный экземпляр шаблона объявлений в заголовочный файл. Я не видел эту практику раньше и хотел бы знать, требуется ли это по стандарту.

Вот небольшой пример:

хиджры

struct A
{
    template<class T>
    void g(T t);
};

a.cpp

#include "A.h"

template<class T>
void A::g(T t)
{ /* ... */ }

template void A::g(int); // Explicit instantiation of the definition.

main.cpp

#include "A.h"

int main()
{
    A a;
    a.g(0);
}

Формулировка в стандарте не дает мне понять, требуется ли также явное создание экземпляра декларации . По-видимому, это в первую очередь относится к «определению, которое никогда не создается в явном виде, неявное создание экземпляра в A.cpp гарантированно не будет сохранено» (не показан), но я был бы признателен за разъяснение.

1 Ответ

0 голосов
/ 28 июня 2018

Требуются ли явные объявления создания экземпляров шаблона в заголовке при явном создании определений в исходном файле?

Нет. Правило, от [temp] / 10 , выделено мое:

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

В вашем примере A::g<int> неявно создается в main.cpp, но явно в "некоторой единице перевода" (A.cpp). Программа в порядке.

...