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++
윙크 윙크).