I modelli C ++ sono noti per generare messaggi di errore lunghi e illeggibili. Ho un'idea generale del perché i messaggi di errore del modello in C ++ sono così negativi. In sostanza, il problema è che l'errore non viene attivato fino a quando il compilatore non incontra una sintassi non supportata da un certo tipo in un modello. Per esempio:
template <class T>
void dosomething(T& x) { x += 5; }
Se T
non supporta l' +=
operatore, il compilatore genererà un messaggio di errore. E se questo accade in profondità all'interno di una libreria da qualche parte, il messaggio di errore potrebbe essere lungo migliaia di righe.
Ma i template C ++ sono essenzialmente solo un meccanismo per la tipizzazione duck in fase di compilazione. Un errore del modello C ++ è concettualmente molto simile a un errore di tipo runtime che potrebbe verificarsi in un linguaggio dinamico come Python. Ad esempio, considera il seguente codice Python:
def dosomething(x):
x.foo()
Qui, se x
non ha un foo()
metodo, l'interprete Python genera un'eccezione e visualizza una traccia dello stack insieme a un messaggio di errore piuttosto chiaro che indica il problema. Anche se l'errore non viene attivato fino a quando l'interprete non si trova all'interno di alcune funzioni della libreria, il messaggio di errore di runtime non è ancora così grave come il vomito illeggibile emesso da un tipico compilatore C ++. Quindi perché un compilatore C ++ non può essere più chiaro su cosa è andato storto? Perché alcuni messaggi di errore del modello C ++ fanno letteralmente scorrere la finestra della mia console per oltre 5 secondi?
clang++
wink wink).