오늘 삽질한 이야기. 우선 아래 코드를 보아주세요.

사용자 삽입 이미지

비슷하게 생겨먹은 코드인데, 위쪽의 make_pair는 문제없이 컴파일되고, 아래쪽 make_pair는 컴파일되지 않습니다. 이게 make_pair 사용하는게 한줄만 있었으면 문제의 원인을 금방 찾았을텐데, 두줄이 연달아 있고 한쪽만 컴파일이 안되어서 끙끙 앓았습니다.

네, 원인은 std::make_pair라고 쓰지 않았기 때문입니다. 또는 저 코드가 들어있는 파일에는 using namespace std; 같은 코드가 없었기 때문입니다.

아직 원인을 모르시겠는 분을 위하여 간단히 설명하자면, std 네임스페이스를 지정하지 않았는데도 컴파일 되어버린 make_pair가 있었기 때문에 컴파일 안되는 쪽을 가지고 삽질을 한 것인데, 이게 컴파일이 잘 된 이유는 Koenig Lookup 때문입니다.

Koenig Lookup을 간단히 설명하자면, 함수를 찾을 수 없을 때, 함수의 인자의 네임스페이스에서 함수를 검색하는 것입니다. 위의 예제에서 전자는 인수 중에 std::string이 있었으므로 std::make_pair를 찾을 수 있었던 것이고, 후자는 그렇지 않으므로 못 찾은 것입니다.

쉽게쉽게 생각하면 Koenig Lookup 따위 하지 않고 컴파일 에러를 내는 것이 올바를 것 같은데, 세상이 그렇게 만만한게 아니라 Koenig Lookup이 존재합니다. 더 자세한 사항은 아래 위키페디아 링크를 참조하시기를.

그리고 오늘 저는 Koenig Lookup의 함정에 보기 좋게 빠져버렸습니다. 하하하. 그래서 사실 저는 C++ 별로 안 좋아해요. ;p

[REF] Argument dependent name lookup [Wikipedia]

'게임 만들기 > 프로그래밍' 카테고리의 다른 글

VS2005에서 갑자기 브레이크포인트가 동작하지 않을 때.  (2) 2007.11.21
병렬 빌드  (0) 2007.10.16
Uncanny Valley  (1) 2007.10.11
top