Instanciação explícita
Você pode usar uma criação de instanciação explícita para criar uma instanciação de uma classe ou função com modelo sem realmente usá-la no código. Como isso é útil quando você está criando arquivos de biblioteca (.lib) que usam modelos de distribuição, definições de modelo sem instanciação não são colocadas em arquivos de objeto (.obj).
Esse código cria explicitamente instanciações de MyStack para variáveis int e seis itens:
template class MyStack<int, 6>;
Essa instrução cria uma instanciação de MyStack sem reservar nenhum armazenamento para um objeto. O código é gerado para todos os membros.
A linha a seguir cria instanciações explicitamente somente para a função membro do construtor:
template MyStack<int, 6>::MyStack( void );
Você pode criar explicitamente uma instanciação para modelos de função usando um argumento de tipo específico para declará-los novamente, conforme mostrado no exemplo em Instanciação do modelo de função.
Você pode usar a palavra-chave extern para impedir a criação automática de instanciações de membros. Por exemplo:
extern template class MyStack<int, 6>;
De forma semelhante, você pode marcar membros específicos como sendo externos e sem instanciação:
extern template MyStack<int, 6>::MyStack( void );
Você pode usar a palavra-chave extern para impedir que o compilador gere o mesmo código de criação de instanciação em mais de um módulo de objeto. Você deve instanciar a função do modelo usando os parâmetros de modelo explícitos especificados em pelo menos um módulo vinculado, caso a função seja chamada, ou receberá um erro do vinculador quando o programa for criado.
Dica
A palavra-chave extern na especialização se aplica somente a funções de membro definidas fora do corpo da classe.As funções definidas na declaração de classe são consideradas funções embutidas e sempre têm instanciações.