2017-11-23 27 views
1

멤버 함수를 boost :: asio의 async_accept() 메서드에 대한 AcceptHandler로 전달하려고합니다.boost :: asio acceptor.async_accept()에 멤버 함수를 전달하는 방법

AcceptHandler 유형 요구 사항은 연결된 줄에서

을 충족하지 : 내가 말하는 컴파일 오류가 발생하면 다음 줄에 오류가 발생하는 경우

//이 있음을 의미하여 핸들러가 문서화 된 AcceptHandler 요구 사항을 충족시키지 못합니다. documentation

핸들러는 다음과 같이한다 말한다 :

void accept_handler(const boost::system::error_code& error) //documentation 
{ 
    if (!error) 
    { 
    // Accept succeeded. 
    } 
} 

내 멤버 함수는 다음과 같습니다

void WifiConnector::onAccept(const boost::system::error_code &ec) //my code 
{ 
    if (ec) { 
     std::cout << ec.message(); 
     return; 
    } 
    socket.async_read_some(boost::asio::buffer(mBuffer), &WifiConnector::readHandler); 
} 

내가 점에서 차이를 찾을 수 없습니다. 그것은 내가 가정 멤버 함수이기 때문에

acceptor.async_accept(socket, &WifiConnector::onAccept); //my code 

대신

acceptor.async_accept(socket, accept_handler); //documentation 

의 :

는하지만이 같은 acceptor.async_accept() 메서드를 호출해야합니다. 난 그냥 문서처럼 통과하려고하면 제안 : 오버로드 기능없이 예 :

acceptor.async_accept(socket, onAccept); //my code 

라는 오류가 있습니다.

멤버 함수를 잘못된 방식으로 전달했거나 잘못했기 때문에 오류가 발생 했습니까?

편집 : 내가 길을 잘못 또는 무엇에 멤버 함수를 통과하고 있기 때문에 나는 수용체 등

+0

& WifiConnector :: onAccept의 개체는 어디에 있습니까? 그 정적 메서드가 아닙니다. –

+0

다른 곳에서 만들어지고 시작 전화 만받습니다. 다른 모든 메소드 호출 (예 :'async_accept()')은 객체 내에서 수행됩니다. – MrJonas

답변

1

부스트 문서는 수용체 here

위의 링크에서 발췌에 비 정적 방법을 전달하는 방법을 명시 적으로 언급 .

0

을 보유하고있는 객체 내에서 async_accept() 메서드를 호출하고 오류가 내가 틀렸어?

일반 기능 및 호출 (비 정적) 멤버 함수를 호출하는 데 차이가 있습니다. 후자는 적절한 객체와 함께 호출 될 수 있습니다. 따라서 통화를 전달하는 여러 가지 방법 중 하나를 사용해야합니다. 다른 스레드가 참조로 지금에 액세스하고 소유하는 스레드가 유지 있음에 따라 달라질 수 있습니다 당신이, 당신의 와이파이 개체의 수명에 대한 몇 가지 심각한 생각을해야하지만

WifiConnector wifi; 
... 
acceptor.async_accept(socket, [&wifi] (const auto& ec) { wifi.onAccept(ec); }); 

참고 : 가장 쉬운 방법은 람다를 사용하는 살아있는 개체. 예를 들어 평범한 참조가 아닌 shared_ptr 또는 weak_ptr 객체를 전달하는 것은 asio 콜백 내에서 일반적이지 않습니다.클래스 경우

void my_class::accept_handler(
    const boost::system::error_code& ec) 
{ 
    ... 
} 
... 
acceptor.async_accept(..., 
    boost::bind(&my_class::accept_handler, 
     this, boost::asio::placeholders::error)); 

당신은 인스턴스와 this을 대체 할 수