Les modèles C ++ sont connus pour générer des messages d'erreur longs et illisibles. J'ai une idée générale de la raison pour laquelle les messages d'erreur de modèle en C ++ sont si mauvais. Essentiellement, le problème est que l'erreur n'est déclenchée que lorsque le compilateur rencontre une syntaxe qui n'est pas prise en charge par un certain type dans un modèle. Par exemple:
template <class T>
void dosomething(T& x) { x += 5; }
Si T
ne prend pas en charge l' +=
opérateur, le compilateur générera un message d'erreur. Et si cela se produit au fond d'une bibliothèque quelque part, le message d'erreur peut contenir des milliers de lignes.
Mais les modèles C ++ ne sont essentiellement qu'un mécanisme de typage de canard au moment de la compilation. Une erreur de modèle C ++ est conceptuellement très similaire à une erreur de type d'exécution qui peut se produire dans un langage dynamique comme Python. Par exemple, considérez le code Python suivant:
def dosomething(x):
x.foo()
Ici, s'il x
n'a pas de foo()
méthode, l'interpréteur Python lève une exception et affiche une trace de pile avec un message d'erreur assez clair indiquant le problème. Même si l'erreur n'est déclenchée que lorsque l'interpréteur est au fond d'une fonction de bibliothèque, le message d'erreur d'exécution n'est toujours pas aussi mauvais que le vomissement illisible craché par un compilateur C ++ typique. Alors pourquoi un compilateur C ++ ne peut-il pas être plus clair sur ce qui ne va pas? Pourquoi certains messages d'erreur du modèle C ++ font-ils littéralement défiler la fenêtre de ma console pendant plus de 5 secondes?
clang++
wink wink).