Ir para o conteúdo

Última atualização:2026-10-12

Desambiguação de templates em C++

1.Contexto

Recentemente me deparei com este trecho de código:

 auto chunk_left = first_sort_key.template GetChunk<ArrayType>(left);

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:

https://en.cppreference.com/w/cpp/language/dependent_name

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 é:

template <typename T>
auto foo_is_a_template() {
  return T::template foo<34>::val();
}

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

Comentários