Las plantillas de C ++ son conocidas por generar mensajes de error largos e ilegibles. Tengo una idea general de por qué los mensajes de error de plantilla en C ++ son tan malos. Esencialmente, el problema es que el error no se activa hasta que el compilador encuentra una sintaxis que no es compatible con cierto tipo en una plantilla. Por ejemplo:
template <class T>
void dosomething(T& x) { x += 5; }
Si T
no es compatible con el +=
operador, el compilador generará un mensaje de error. Y si esto sucede en lo profundo de una biblioteca en algún lugar, el mensaje de error puede tener miles de líneas de largo.
Pero las plantillas C ++ son esencialmente solo un mecanismo para escribir en tiempo de compilación. Un error de plantilla de C ++ es conceptualmente muy similar a un error de tipo de tiempo de ejecución que puede ocurrir en un lenguaje dinámico como Python. Por ejemplo, considere el siguiente código de Python:
def dosomething(x):
x.foo()
Aquí, si x
no tiene un foo()
método, el intérprete de Python lanza una excepción y muestra un seguimiento de la pila junto con un mensaje de error bastante claro que indica el problema. Incluso si el error no se activa hasta que el intérprete se encuentre dentro de alguna función de la biblioteca, el mensaje de error en tiempo de ejecución aún no es tan malo como el vómito ilegible arrojado por un compilador típico de C ++. Entonces, ¿por qué un compilador de C ++ no puede ser más claro sobre lo que salió mal? ¿Por qué algunos mensajes de error de plantilla C ++ literalmente hacen que la ventana de mi consola se desplace durante más de 5 segundos?
clang++
guiño guiño).