Última actualización:2026-10-12
Desambiguación de plantillas en C++¶
1. Contexto¶
Hace poco vi un fragmento de código:
¿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:
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();
}
El ejemplo correspondiente con .template es:
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¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事