"컴파일 에러" 선택하시면 이유를 보실 수 있어요..
2178번 - 미로 탐색
"컴파일 에러" 선택하면 이유를 볼 수 있다는 걸 가르쳐 주신 sgchoi5님 감사합니다~~
queue 부분 컴파일 에러 해결 해 주신 kesakiyo님 감사합니다~~
에러 부분 검색하다가 C++에서 ' > ' 을 연속해서 쓸 수 없다는 걸 알았네요!!
제 질문에 댓글 남겨주셔서 감사합니다~~~
C++11은 다음과 같이 중첩된 템플릿을 사용할 때 '>' 을 연속해서 쓸 수 없는 문제점을 해결했습니다.
map<string,vector<int>> heroChronicles;
C++98에서는 위 코드가 컴파일되지 않습니다. 왜냐하면 “>>”이 연속된 ‘>’으로 인식되는 것이 아니라 구문 분석 시작 전 어휘 분석 단계(lexical analysis)에서 최대 흡수(Maximal munch) 규칙에 따라 “>>” 토큰으로 인식되고 이는 다시 문법 단계에서 “>>” 연산자로 인식되기 때문입니다. 템플릿 초심자들이 많이 저지르는 실수입니다.
이 뿐 아니라 새로운 형태의 형변환 연산자도 비슷한 문제가 있습니다.
static_cast<List<B>>(ld);
>>= 및 >= 도 비슷한 문제가 발생할 수 있습니다.
void func(List<B>= default_val1);
void func(List<List<B>>= default_val2);
템플릿이 많이 사용되면 많이 사용될 수록 이런 코드는 더 큰 문제가 될 것입니다.
애초에 이런 문제가 발생했던 것은 컴파일러가 이론적으로 다음과 같이 몇 가지 단계를 처리하므로
* 어휘 분석
* 문법 분석
* 형식 체크
이 문제를 해결하기 위해서는 어휘 분석 단계가 문법 분석 단계와 협력해야 하는 문제가 발생하게 되기 때문이었습니다. 결국 컴파일러 구현자들을 위한 결정이었던 것입니다.
그런데 시중에 출시된 C++ 컴파일러들이 이 문제를 인식하고 친철한 에러 메시지를 출력하고 있다는 것을 표준화를 진행하는 동안 알게 됐습니다.
예를 들어, g++에서는 다음과 같은 에러 메시지를 출력하고 있습니다.
error: ‘>>’ should be ‘> >’ within a nested template argument list
이 정도로 이미 컴파일러들이 이 문제를 나름대로 인식하고 해결하고 있었기 때문에 C++11에서는 어휘 분석 단계와 문법 분석 단계가 협력하여 문제를 해결하도록 표준에 명시하기에 이르렀습니다. 기본적으로 다음과 같은 규칙을 따르도록 되어 있습니다.
왼쪽 ‘<’ 이 ‘>’과 매치가 되어 있지 않은 동안에는 >> 토큰은 오른쪽 shift 연산자가 아닌 두 개의 연속된 ‘>’로 인식되도록 한 것입니다.
댓글을 작성하려면 로그인해야 합니다.
s0j0s 6년 전