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을 하여 알아서 처리해 줌)하거나, 아니면 직접 가능하도록 구현을 해 주어야 함!
'프로그래밍 언어' 카테고리의 다른 글
ConEmu(Console Emulator) + MSYS2를 이용해 윈도우에서 GCC 5.x를 사용하자 (0) | 2015.08.27 |
---|---|
Linux(Ubuntu)에서 std::thread(std::async 등등) 사용하기 (0) | 2015.08.26 |
The Definitive C++ Book Guide and List (0) | 2015.07.09 |
[요약번역] const T vs. T const (0) | 2015.03.22 |
C++ 템플릿 가이드 (C++ Templates The Complete Guide) (0) | 2014.04.18 |