Os modelos C ++ são notórios por gerar mensagens de erro longas e ilegíveis. Eu tenho uma idéia geral de por que as mensagens de erro do modelo em C ++ são tão ruins. Essencialmente, o problema é que o erro não é acionado até que o compilador encontre uma sintaxe que não é suportada por um determinado tipo de modelo. Por exemplo:
template <class T>
void dosomething(T& x) { x += 5; }
Se T
não suportar o +=
operador, o compilador gerará uma mensagem de erro. E se isso acontecer dentro de uma biblioteca em algum lugar, a mensagem de erro pode ter milhares de linhas.
Mas os modelos C ++ são essencialmente apenas um mecanismo para digitação de patos em tempo de compilação. Um erro de modelo C ++ é conceitualmente muito semelhante a um erro de tipo de tempo de execução que pode ocorrer em uma linguagem dinâmica como Python. Por exemplo, considere o seguinte código Python:
def dosomething(x):
x.foo()
Aqui, se x
não houver um foo()
método, o interpretador Python lança uma exceção e exibe um rastreamento de pilha junto com uma mensagem de erro bastante clara indicando o problema. Mesmo que o erro não seja acionado até que o intérprete esteja profundamente dentro de alguma função da biblioteca, a mensagem de erro de tempo de execução ainda não será tão ruim quanto o vômito ilegível emitido por um compilador C ++ típico. Então, por que um compilador C ++ não pode ser mais claro sobre o que deu errado? Por que algumas mensagens de erro do modelo C ++ literalmente fazem com que a janela do meu console role por mais de 5 segundos?
clang++
wink wink).