프로그래밍 언어2015. 7. 31. 09:52

MEC++ 공부하면서, errata를 발견해서 Scott Meyers 옹의 홈페이지를 방문 해 봤더니, 지난 5월에 report가 되었더라. : )

http://www.aristeia.com/BookErrata/emc++-errata.html



Item 34에 lambda 대신 bind를책에 있는 코드를 그대로 작성했는데 컴파일 에러가 발생했다.


그런데, 옷갖 template의 향연으로인해 에러 메시지는 거의 암호 수준;;


그래서 장인정신으로 STL의 해당 template들을 한 줄 한 줄 따라가다 보니 std::plus functor의 template parameter가 하나의 타입만 받도록 되어 있는데, 실제로 더하려고 하는 object는 std::chrono::steady_clock::time_point와 std::chrono::duration이었기 때문에 발생한 에러 였음.

실제로 std::plus 내부에서 호출하는 operator+는 function template으로 time_point와 duration을 더할 수 있도록 overload 되어 있지만, std::plus는 template이기 때문에 암시적인 형 변환을 할 수 없고, 따라서 operator+까지 도달하지도 못함.



즉, operator+는 연산을 지원하나, binding 시점이 아닌, 호출 시점에 evaluation이 되어야 하기 때문에 사용하는 std::plus가 두 개의 타입을 지원하지 않기 때문에, C++14에서 지원하는 std::plus<void>를 이용(type deducing을 하여 알아서 처리해 줌)하거나, 아니면 직접 가능하도록 구현을 해 주어야 함!


Posted by 세월의돌