2013-07-01 8 views
6

나는 +++ 4.7 (Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04, 구체적으로)에서 C++ 11에 대한 지원을 모색 중이며 차이점을 찾는 것으로 보인다. 특히std :: bind와 boost :: bind 사이에 중요한 차이점이 있습니까?

, 내가 #include <boost/bind.hpp>을 주석 체계적 (http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp에서 가져온) 부스트 ASIO 비동기 클라이언트 예 std::bindboost::bind의 발생을 교체 할 경우, 프로그램은 더 이상 컴파일되지 않습니다.

설명이 있으십니까?

+2

boost::asio::stdplaceholders::*을 사용할 수 있습니까? – Praetorian

+0

중첩 된 바인딩과 다른 동작을 보았던 것을 기억합니다. 지금 구체적인 내용은 기억하지 마십시오. 그러나, 이것은 당신이 여기서 무엇을 실행하고 있는지는 아닙니다. – sehe

답변

7
#include <functional> 
namespace boost { 
    namespace asio { 
     namespace stdplaceholders { 
      static decltype (:: std :: placeholders :: _1) & error = :: std :: placeholders :: _1; 
      static decltype (:: std :: placeholders :: _2) & bytes_transferred = :: std :: placeholders :: _2; 
      static decltype (:: std :: placeholders :: _2) & iterator = :: std :: placeholders :: _2; 
      static decltype (:: std :: placeholders :: _2) & signal_number = :: std :: placeholders :: _2; 
     } 
    } 
} 

당신이 실패 교체 (바람직하게는 단일 교체)하고 컴파일러 오류와 함께 수정 된 코드를 게시하시기 바랍니다 수 대신 boost::asio::placeholders::*

+0

매력처럼 일했습니다. 많은 감사합니다! –

4

std::bind과 함께 사용할 수 없습니다. boost::asio::placeholders처럼 보입니다. 당신이 연결 한 예에서, boost::bind에 대한 첫 번째 호출은 다음 코드에서 발생 std::bind

resolver_.async_resolve(query, 
    boost::bind(&client::handle_resolve, this, 
     boost::asio::placeholders::error, 
     boost::asio::placeholders::iterator)); 

단순히 boost::bind를 교체

오류의 무리로 연결됩니다. 컴파일하려면 boost::asio::placeholdersstd::placeholders으로 바꿔야합니다.

resolver_.async_resolve(query, 
    std::bind(&client::handle_resolve, this, 
     std::placeholders::_1, 
     std::placeholders::_2)); 

코드가 변경된 후에 기능적으로 동일하다는 것을 확인하지 않고 컴파일 만한다는 점에 유의하십시오.