본문 바로가기
컴퓨터/디버깅

긴 오류 메세지 알아 보기

by adnoctum 2013. 5. 22.




   STL 을 사용하다 보면 특히나 오류 메세지가 매우 길어질 때가 자주 있다. 길어진 이유를 찬찬히 뜯어 보면 별 내용은 없고 대부분 STL 의 container 의 형 선언 때문인데, 보통 사용할 때는 기본값(default 값)으로 되어 있는 것을 사용하기 때문에 명시적으로 코드에 적어 주지 않는 것들이 오류 메세지에는 전부 나오기 때문에 길어지곤 한다. 이러한 것들을 무시하고 오류 메세지를 읽으면 좀 더 빨리 오류 메세지의 의미를 알 수 있다. 혹은, 오류 메세지의 제일 끝부터 읽으면 된다. 예를 들면 다음과 같다. 


[adnoctum@nomadism analysis_code]$ make

g++ -c check_data_set_consistency_with_gene_rank.cpp

check_data_set_consistency_with_gene_rank.cpp: In function ‘double get_consistence_value(const std::string&, const std::string&, const std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > > > > >&, const std::string&, const std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > > > > >&)’:

check_data_set_consistency_with_gene_rank.cpp:118: error: could not convert ‘(pos1 <unknown operator> ((const __gnu_cxx::__normal_iterator<const std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >*, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > > > > >&)((const __gnu_cxx::__normal_iterator<const std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >*, std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > > > > >*)(&((const std::vector<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >, std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > > > >*)mat1)->std::vector<_Tp, _Alloc>::end [with _Tp = std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > >, _Alloc = std::allocator<std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double> > > >]()))))’ to ‘bool’

make: *** [check_data_set_consistency_with_gene_rank.o] Error 1

[adnoctum@nomadism analysis_code]$ 



정신이 아득해진다... 작업 환경은 리눅스에서 gcc 를 이용했다. 우선 오류가 난 부분을 가장 먼저 살펴 본다. 위에 표시한 118 번째 줄이다. 이 부분 근처를 보면, 








저렇다. 오류 메세지가 특히나 길어 진 이유는 STL의 container 를 


std::pair<std::string,std::vector<std::map<std::string,double> > >


와 같은 것을 더군다나 const 의 reference 로 쓰고 있기 때문이다. 좌우지간 에러가 난 118 번째의 줄을 보되, 위에서 표시한 에러 메세지 중 가장 마지막에 있는 to bool 에 촛점을 둬보자. 뭔진 모르겠지만 하여튼 boolean type 으로 변환할 수 없다는 의미일 것이다. 이런 생각을 갖고 118 번째 줄을 보면 


pos1 = mat1.end(); 


바로 이 부분이 눈에 들어 온다. pos1 은 std::vector<std::map<std::string,double> >::const_iterator 인데 이 값에 [mat1.end()] 값을 넣어 주고 있다. 


118         for(pos1 = mat1.begin(), pos2 = mat2.begin(); pos1 = mat1.end(); pos1++, pos2++){


저 부분. 그래, 바로 저 부분에서 에러가 난 것이다. 그런데, 가만 생각해 보면 왜 bool 로 전환할 수 없다고 했을까? 그것은 for 문은 형식 상 


for( 초기 조건 ; 종료 조건; 매번 수행할 일)


을 취하기 때문에 두 번째 부분에 boolean type 이 들어가야 하기 때문이다. 그런데 pos1 = mat1.end(); 구문은 [pos1] 의 값을 갖는 식이기 때문에 결국  std::vector<std::map<std::string,double> >::const_iterator type 이다. 바로 이 type 을 boolean 으로 변경할 수 없었던 것이다. 



해결 방법은, ㅋ, 간단하다. 오타를 수정한다. = 를 != 으로.