visual studio에서는 아무런 문제 없이 컴파일 됐는데 백준에 제출하니 다음과 같은 컴파일 에러가 발생했다. 이렇게 한쪽에서만 안 돌아가는 문제가 가장 해결하기 까다로운 것 같다;
error: no matching function for call to ‘find(std::vector<int>::iterator, std::vector<int>::iterator, int&)’
C++을 사용할 땐 항상 조심해야할 게 있다. 대부분의 사람들이 편의를 위해 using spacename std; 를 사용하여 표준 라이브러리의 함수 앞에 std를 생략하고는 한다. 이 때 치명적인 문제가 발생할 수 있다. A 라이브러리와 B 라이브러리에 공통적으로 alphabet 이라는 함수가 들어있다고 가정해보자. std를 생략해버리면 alphabet 함수가 A 소속인지 B 소속인지 알 수 없다. 따라서 충돌이 발생할 수 있다.
위의 에러 역시 using spacename std를 사용하여 잡아내기 어려웠던 것이다. 결론적으로, <algorithm> 헤더파일을 추가하지 않아서 생긴 문제였다. 그런데 왜 visual studio에서는 에러가 발생하지 않았던걸까? 특정 헤더파일이 algorithm 헤더파일을 포함하고 있을 수 있기 때문이다. 그게 어떤 헤더파일일지는 정확히 모른다. 만약 내가 std::find 이런식으로 코드를 짰다면 에러를 금방 발견할 수 있었을 것이다.
경험상 컴파일 에러 메세지만 보고 해결할 수 없는 문제들은 항상 std를 생략해서 발생한 것이었다. 이런 에러는 사람을 미치게 만든다. 몇시간을 헤매다가 원인을 발견하면 그렇게 허무할 수가 없다. 구글링이 불가능한 상황이라고 생각해보면 정말 끔찍하다. 그런데 그렇다고 매번 표준 라이브러리의 변수, 함수를 사용할 때마다 std를 붙여주긴 어려운 일이다... 그래서 자주 쓰이는 cout 같은건 using std::cout; 이렇게 써주면 된다.
'나도 공부한다 > 삽질' 카테고리의 다른 글
(React) API로 받아온 값을 상태값에 넣어주기 전에 화면이 렌더링되는 문제 (0) | 2024.01.18 |
---|---|
react로 검색기능 만들면서 삽질한 이야기 (with 디바운스) (0) | 2024.01.16 |
[git] git bash에서 anaconda 끄기 (0) | 2022.12.07 |
[git] 실수로 다른 브랜치에 커밋했을 때 (0) | 2022.12.06 |
[git] push 오류 (The upstream branch of your current branch does not matchthe name of your current branch. ) (1) | 2022.11.28 |