s0j0s   2년 전

C++로 제출시 컴파일 에러가 떠서

C++11로 제출하니 정답이라고 떴습니다.

C++로 제출시 무슨 이유로 컴파일 에러가 뜨는지 궁금합니다.

알려주시면 감사하겠습니다!!!

sgchoi5   2년 전

"컴파일 에러" 선택하시면 이유를 보실 수 있어요..

kesakiyo   2년 전

queue<pair<int, int>> q;

이 부분이 문제가 날 것 같네요.

queue<pair<int, int> > q;

이렇게 바꿔줘야 컴파일 에러가 안납니다.

s0j0s   2년 전

"컴파일 에러" 선택하면 이유를 볼 수 있다는 걸 가르쳐 주신 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 연산자가 아닌 두 개의 연속된 ‘>’로 인식되도록 한 것입니다.

댓글을 작성하려면 로그인해야 합니다.