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

cannot convert ...

by adnoctum 2011. 6. 23.


아주 전형적인 오류 메세지이다. 실제 에러는 다음과 같다.

qtest.cpp: In function ‘int main(int, const char**)’:
qtest.cpp:23: error: cannot convert ‘std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >**’ to ‘std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >*’ for argument ‘2’ to ‘bool get_qvalue_with_pvalue(std::vector<double, std::allocator<double> >, std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >*, std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >*, double*)’


STL 을 사용했기 때문에 에러 메세지가 아주 복잡한데, 실제 의미는 다음과 같이 구분하여 알아 볼 수 있다.


qtest.cpp: In function ‘int main(int, const char**)’:
qtest.cpp:23: error: cannot convert ‘std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >**’ to ‘std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >*’ for argument ‘2’ to ‘bool get_qvalue_with_pvalue(std::vector<double, std::allocator<double> >, std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >*, std::map<double, double, std::less<double>, std::allocator<std::pair<const double, double> > >*, double*)’

그리고, qtest.cpp 이 23 번째 줄 근처는 다음과 같다.


에러 메세지의 의미는 이렇다.

std::map<double,double>** 형태를 bool get_qvalue_with_pvalue 함수의 2번째 argument 로 변환할 수 없다는 것이다. 이 때, 그 두 번째 argument 의 type 은 위에서 붉은 배경으로 표시한 std::map<double,double>* 이다. 즉, get_qvalue_with_pvalue 함수는 두 번째 인자로 map 의 pointer 를 받아야 하는데, 넘겨줄 때 위 23 번째 코드에서 보듯이 double pointer 를 넘기고 있다. 따라서 이 이중 포인터를 포인터로 변환해야 하는데 그렇게 할 수 없다는 것이다.

수정하는 거야, 뭐, 지금은, ㅋㅋ, 오타니까 그냥 하면 되는 거고, 하여튼 이런 류의 cannot convert 류의 오류 메세지는 뒤에 대부분 이런 식으로 에러 메세지가 나오게 된다. 단지 STL 을 쓸 때처럼 길어지면 그 의미를 한 눈에 파악하기 힘들지만 차근차근 들여다 보면 아주 명확한 것을 알 수 있다.