Saltar a contenido

Última actualización:2026-10-12

Desambiguación de plantillas en C++

1. Contexto

Hace poco vi un fragmento de código:

 auto chunk_left = first_sort_key.template GetChunk<ArrayType>(left);
¿Qué significa aquí el .template?

Esta sección parte de ejemplos reales para explorar ese significado.

2. template disambiguator

En C++, al usar nombres dependientes (dependent names) de una plantilla, a veces es necesario usar el desambiguador de plantillas (template disambiguator) para ayudar al compilador a distinguir estos nombres. Los llamados "dependent names" son tipos o valores que dependen de los parámetros de la plantilla, y el compilador no puede determinar su significado concreto antes de instanciar la plantilla. Esto puede provocar ambigüedades cuando el compilador analiza estos nombres.

El desambiguador de plantillas (template disambiguator) usa la palabra clave "template" para decirle al compilador con claridad que un nombre concreto es una plantilla. Así el compilador puede analizar correctamente ese nombre sin generar ambigüedades.

La palabra clave template solo puede usarse con los operadores :: (resolución de ámbito), -> (acceso a miembros mediante puntero) y . (acceso a miembros); los siguientes son todos ejemplos válidos

  • T::template foo();
  • s.template foo();
  • this->template foo();
  • typename T::template iterator::value_type v;

Documentación oficial:

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

Supongamos el código siguiente: ¿qué obtenemos si no añadimos .template?

template <typename T>
auto foo_is_not_a_template() {
  // ((T::foo) < 34) > (::val())
  return T::foo<34>::val();
}
Lo anterior se analiza como: ((T::foo) < 34) > (::val())

El ejemplo correspondiente con .template es:

template <typename T>
auto foo_is_a_template() {
  return T::template foo<34>::val();
}
Así, la llamada se analiza correctamente como plantilla, foo<34>.

El código completo de esta sección se publicará en el planeta de conocimiento; si te interesa, únete. ¡Gracias!

Temas relacionados

Comentarios