Шаблоны C ++ известны тем, что генерируют длинные нечитаемые сообщения об ошибках. У меня есть общее представление о том, почему сообщения об ошибках шаблона в C ++ такие плохие. По сути, проблема в том, что ошибка не вызывается до тех пор, пока компилятор не обнаружит синтаксис, который не поддерживается определенным типом в шаблоне. Например:
template <class T>
void dosomething(T& x) { x += 5; }
Если оператор T
не поддерживает +=
, компилятор сгенерирует сообщение об ошибке. И если это происходит где-то глубоко внутри библиотеки, сообщение об ошибке может быть длиной в тысячи строк.
Но шаблоны C ++, по сути, всего лишь механизм для утки во время компиляции. Ошибка шаблона C ++ концептуально очень похожа на ошибку типа времени выполнения, которая может возникнуть в динамическом языке, таком как Python. Например, рассмотрим следующий код Python:
def dosomething(x):
x.foo()
Здесь, если x
нет foo()
метода, интерпретатор Python генерирует исключение и отображает трассировку стека вместе с довольно четким сообщением об ошибке, указывающим на проблему. Даже если ошибка не сработает до тех пор, пока интерпретатор не окажется глубоко внутри какой-либо библиотечной функции, сообщение об ошибке времени выполнения все равно не так плохо, как нечитаемая рвота, извергаемая типичным компилятором C ++. Так почему же компилятор C ++ не может быть более ясным о том, что пошло не так? Почему некоторые сообщения об ошибках шаблона C ++ буквально вызывают прокрутку окна моей консоли более 5 секунд?
clang++
подмигнул).