2012-11-19 2 views
2

boost :: bind를 boost :: function과 함께 사용하려고하는데 컴파일 오류가 발생했습니다. 개체 틀에 자리 표시자를 바인딩 할 수없는 이유는 무엇입니까?왜이 "boost :: bind"컴파일을하지 않습니까?

void fun_1(const boost::system::error_code& error) 
{ 
    std::cout<<"test_1------------"<<std::endl; 
} 
void fun_2(int i) 
{ 
    std::cout<<"tset_2------------"<<std::endl; 
} 
int main(void) 
{ 
    boost::function0<void> fobj; 
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed 
    fobj = boost::bind(&fun_2,5);//syntax is ok 
    return 0; 
} 
+0

무엇이 오류입니까? 관련 asio 헤더를 포함 하시겠습니까? asio 대신에 _1을 사용하면 컴파일됩니까? –

+0

템플릿 인스턴스화에 대한 오랜 오류 메시지가 있습니다. 필요한 모든 헤더가 포함되어 있다고 생각합니다. – user1834749

답변

0

참고 : http://my.oschina.net/yellia/blog/90678을 보면 저자는 boost :: bind 구현을 명확하고 간단하게 설명합니다. 나는 그것이 당신을 도울 것이라는 점을 희망한다. 哈哈

+0

링크는 중국어로되어 있습니다. 답변을 편집하고 번역 된 버전을 올리실 수 있습니까? –

2

서명이 일치하지 않습니다. 이 시도 : 향후 참조를 위해 g++ main.cpp -lboost_system -lpthread

와 GCC에서 테스트

#include <boost/function.hpp> 
#include <boost/asio.hpp> 
#include <boost/bind.hpp> 

void fun_1(const boost::system::error_code& error) 
{ 
    std::cout<<"test_1------------"<<std::endl; 
} 
void fun_2(int i) 
{ 
    std::cout<<"tset_2------------"<<std::endl; 
} 

int main(void) 
{ 
    boost::function<void (const boost::system::error_code&)> fobj; 
    fobj = boost::bind(&fun_1,boost::asio::placeholders::error); 
    return 0; 
} 

컴파일, 그것은

  • 완전히 컴파일 가능한 예제
  • 전체 컴파일/링커 오류 메시지
를 추가하는 데 도움이

스 니펫을 t와 같이 게시 할 때 그는 당신을 돕고 싶은 사람들을 구하기 위.

+0

답장을 보내 주셔서 감사합니다.이 질문을하기 전에이 방법을 시도했지만 " "boost :: bind (& fun_2,5)"는 "boost :: bind (& fun_1, boost :: asio :: placeholders :: error)"를 컴파일 할 수 있습니다. 이 두 함수의 차이점은 매개 변수 수가 같고 유형이 다르다는 것입니다. 특별히 처리 된 자리 표시 자입니까? – user1834749

+2

@ user1834749 차이점은'bind (& fun_2,5)'는'bind (& fun_1, praceholders :: error)'또는'bind (& fun_1, _1) '함수가 추가 인수를 허용하지 않는 "nullar" 'ary 1, 즉 호출자가 제공해야하는 1 개의 인수를 가진 함수 객체를 생성합니다 :'fobj (someError)'. –

2

당신은 함수가

를 호출 할 때 제공 할 수 있도록의 error_code 대신 자리의 바인딩에 대한 값을 전달해야 서명을 변경하지 못할 경우 예 :

#include <boost/bind.hpp> 
#include <boost/function.hpp> 
#include <boost/asio.hpp> 
#include <boost/system/error_code.hpp> 

void fun_1(const boost::system::error_code& error) 
{ 
    std::cout<<"test_1------------"<<std::endl; 
} 
void fun_2(int i) 
{ 
    std::cout<<"tset_2------------"<<std::endl; 
} 

int main() 
{ 
    boost::function0<void> fobj; 
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed 

    fobj = boost::bind(&fun_1, 
      boost::system::errc::make_error_code(boost::system::errc::success));//compiles ok 

    // fobj = boost::bind(&fun_2,5);//syntax is ok 
    return 0; 
} 
+0

아하, 작동, 고마워. 우리가'async_read' 또는'async_write'를'bind'와 사용할 때'placeholders :: error'가'system :: error_code &'로 변환하는 방법에 대한 더 많은 정보에 접근해야한다고 생각합니다. – user1834749

+0

@ user1834749 답변에 만족하면 틱을 클릭하여 수락 할 수 있습니다. – mark

관련 문제