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 ++ siano così negativi. In sostanza, il problema è che l'errore non viene attivato fino a quando il compilatore non incontra la sintassi che non è supportata da un determinato tipo in un modello. Ad 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à in una libreria da qualche parte, il messaggio di errore potrebbe essere lungo migliaia di righe.
Ma i modelli C ++ sono essenzialmente solo un meccanismo per la digitazione anatra in fase di compilazione. Un errore di 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 metodo foo()
, 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 si trova in profondità all'interno di alcune funzioni della libreria, il messaggio di errore di runtime non è comunque così male 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 ++ provocano letteralmente lo scorrimento della finestra della console per oltre 5 secondi?