Como faço para instanciar explicitamente uma função de modelo?

117

Eu tenho uma função de modelo com um argumento. Tenho que instanciar essa função sem chamar essa função significa explicitamente que tenho que instanciar.

Tenho esta função:

template <class T> int function_name(T a) {}

Eu instanciei essa função assim:

template int function_name<int>(int);

Mas recebi os seguintes erros:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
Balaji
fonte

Respostas:

182

[EDIT 2]: Observe que houve alguma confusão em relação ao código da pergunta original devido a problemas de formatação do código. Veja a resposta de AnthonyHatchkins para mais detalhes.

Se você realmente deseja instanciar (em vez de especializar ou algo assim), faça o seguinte:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[EDITAR] Parece haver (muita) confusão em relação à instanciação e especialização explícitas. O código que postei acima trata da instanciação explícita . A sintaxe para especialização é diferente. Aqui está a sintaxe para especialização:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Observe que os colchetes angulares após o modelo!

hrnt
fonte
3
isso é instanciação ou especialização ?
Nawaz
5
Não é verdade. Você pode dizer ao compilador para instanciar modelos explicitamente. Google para "instanciação de modelo explícito C ++" para obter mais detalhes.
hrnt
8
@Nawaz: você está errado. Claro que é sempre o compilador quem instancia, essa linha é uma solicitação do programador ao compilador para instanciar o modelo. Se você tiver uma cópia do padrão C ++, leia
14.7.2 Instanciação
16
Especialização significa que provavelmente você está alterando sua implementação. Instanciação significa simplesmente que você o está atribuindo a uma unidade de compilação específica, possivelmente para obter seu endereço exclusivo ou torná-lo disponível como uma função de biblioteca ou para reduzir o inchaço.
CashCow de
3
@hrnt: Acho que você está certo. @Ashot: Acabei de notar que a sintaxe não tem template<>forma. O que ele escreveu é diferente de especialização . 1 por me ensinar essa coisa nova. Estou removendo minha postagem. : D
Nawaz
20

Seu código está correto.

A mensagem de erro pertence a um local no código que você não citou aqui.

Atualizar:

O código original era

template <class T> int function_name(T a) {}
template int function_name<int>(int);

e estava correto.

Mas não foi citado e, portanto, tinha a seguinte aparência:

template int function_name(T a) {}
template int function_name(int);

Ele gera o seguinte erro

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

o que é claramente diferente do que OP citou.

Nesta variante, a segunda linha está ok ( <int>pode ser omitida aqui), mas a primeira linha está com defeito. O compilador não pode adivinhar que Té um parâmetro de modelo.

Antony Hatchkins
fonte
Tecnicamente, não era o código dele, era a edição do Bill :) O código original é template int function_name( T a) { }etemplate int function_name(int);
hrnt
@hrnt O código original não foi formatado corretamente, mas estava correto. Se eu fosse Balaji , voltaria e aceitaria sua resposta se ele a considerasse útil, mas para mim (e provavelmente para qualquer outra pessoa) sua resposta (embora seja perfeitamente correta por si mesma) não responde à pergunta.
Antony Hatchkins
@hrnt Você está certo ao dizer que o código original era assim. Mas, por causa do argumento do modelo deduzido, ele ainda funciona. Tenho que concordar com Antony Hatchkins que o erro surge de código que o OP não citou, no entanto, acho que sua resposta ainda é útil para pessoas que não sabiam sobre instanciação explícita.
mpark de
Bem, me tome por exemplo. Pesquisei esta página no Google quando queria atualizar meu já esquecido conhecimento sobre instanciação explícita - e não me ajudou muito. Quanto a mim, não há confusão sobre a sintaxe. O que pode causar confusão sobre a instanciação explícita é seu uso
Antony Hatchkins
@AntonyHatchkins Ah, verdade - eu não olhei para a fonte da pergunta original, apenas como ela apareceu na minha tela. Vou marcar isto com +1 e corrigir minha resposta original para observar a confusão em relação à pergunta original.
hrnt