Última atualização:2026-10-12
Desambiguação de templates em C++¶
1.Contexto¶
Recentemente me deparei com este trecho de código:
Afinal, o que significa o .template aqui?
Nesta seção, partiremos de um exemplo real para explorar esse significado.
2.template disambiguator¶
Em C++, ao usar nomes dependentes (dependent names) de templates, às vezes é necessário usar o desambiguador de template (template disambiguator) para ajudar o compilador a distinguir esses nomes. Os chamados "dependent names" são tipos ou valores que dependem dos parâmetros do template, cujo significado concreto o compilador não consegue determinar antes de instanciar o template. Isso pode fazer com que o compilador encontre ambiguidade ao analisar esses nomes.
O desambiguador de template (template disambiguator) usa a palavra-chave "template" para dizer explicitamente ao compilador que um determinado nome é um template. Assim, o compilador consegue analisar corretamente esse nome, sem gerar ambiguidade.
A palavra-chave template só pode ser usada com os operadores :: (resolução de escopo), -> (acesso a membro por ponteiro) e . (acesso a membro); a seguir, alguns exemplos válidos:
- T::template foo
(); - s.template foo
(); - this->template foo
(); - typename T::template iterator
::value_type v;
Documentação oficial:
Suponha o código abaixo: o que obteríamos se não usássemos o .template?
template <typename T>
auto foo_is_not_a_template() {
// ((T::foo) < 34) > (::val())
return T::foo<34>::val();
}
O código acima seria interpretado como: ((T::foo) < 34) > (::val())
O exemplo correspondente com .template é:
Assim, a chamada é corretamente interpretada como o template foo<34>.
O código completo desta seção será publicado no Planeta do Conhecimento; se tiver interesse, basta participar. Obrigado!
Tópicos relacionados¶
- Funções virtuais puras e classes abstratas em C++ | C++那些事
- Asserções com assert em C++ | C++那些事
- Bit fields em C++ | C++那些事
- Implementando polimorfismo de C++ em linguagem C | C++那些事
- Constantes e modificadores com const em C++ | C++那些事
- A família completa do const em C++ | C++那些事
- O operador de desreferência * em C++ | C++那些事
- Inicialização e atribuição em C++ | C++那些事
- Formas de retornar múltiplos valores em C++ | C++那些事
- A palavra-chave mutable em C++ | C++那些事