2010-01-28 121 views
4

我想爲async_write提供一個額外的boost :: function。我想要連接自己的HandleWrite函數先被調用,然後調用提供的boost :: function。結合連接的Boost ::綁定boost :: function參數的方法

會員方法ASIO ASYNC_WRITE

void Connection::HandleWrite(
    const boost::system::error_code& e, 
    boost::function<void (const boost::system::error_code&)> handler) 
{ 
    // Code removed for clarity 

    if(!handler.empty()) 
     handler(e); 
}; 

試圖HandleWrite綁定到ASIO ASYNC_WRITE和提供另一綁定作爲用於處理的值。這不會編譯。我究竟做錯了什麼?

void Connection::QueueRequest(
     boost::shared_array<char> message, 
     std::size_t size, 
     boost::function<void (const boost::system::error_code&)> handler) 
    { 
    // Code hidden for clarity 

    boost::asio::async_write(m_Socket, boost::asio::buffer(buffer), 
     boost::bind(&Connection::HandleWrite, shared_from_this(), 
      boost::asio::placeholders::error, 
      handler 
     ) 
    ); 
    } 

的錯誤信息,我從編譯器得到的是以下幾點:

Error 1 error C2825: 'F': must be a class or namespace when followed by '::' boost\bind\bind.hpp 69 
Error 2 error C2039: 'result_type' : is not a member of '`global namespace'' boost\bind\bind.hpp 69 
Error 3 error C2146: syntax error : missing ';' before identifier 'type' boost\bind\bind.hpp 69 
Error 4 error C2208: 'boost::_bi::type' : no members defined using this type boost\bind\bind.hpp 69 
Error 5 fatal error C1903: unable to recover from previous error(s); stopping compilation boost\bind\bind.hpp 69 
+1

如果您提供了錯誤消息 – 2010-01-28 14:37:05

+0

我會在上面沒有添加上面的錯誤消息。 – 2010-01-29 10:13:38

+0

問題原來是在另一個地方使用相同的HandleWrite函數,並沒有正確綁定。修復後編譯。 – 2010-01-29 10:22:33

回答

0

問題原來是在另一個地方使用相同的HandleWrite函數,並沒有正確綁定。修復後編譯。

0

什麼錯誤(S),你恰好有?我沒有看到你的問題中顯示的代碼有任何明顯的錯誤,所以我不能給你一個直接的答案。

但是,Kornel的回答讓我懷疑,因爲我認爲由boost :: bind生成的函子可以接受任意數量的參數,並且簡單地忽略多餘的參數。

於是我趕緊砍死這個驗證:

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/shared_ptr.hpp> 
#include <boost/enable_shared_from_this.hpp> 
#include <boost/function.hpp> 
#include <string> 
#include <iostream> 


void Foo(const boost::system::error_code&) 
{ 
    // whatever 
} 

struct Client : boost::enable_shared_from_this<Client> 
{ 
    void HandleWrite(
     const boost::system::error_code& Err, 
     boost::function<void(const boost::system::error_code&)> OtherHandler 
    ) 
    { 
     std::cout << "MyHandler(" << Err << ")\n"; 
     OtherHandler(Err); 
    } 

    void MakeTheCall(boost::function<void (const boost::system::error_code&)> Other) 
    { 
     using boost::asio::ip::tcp; 

     // Of course, the scope and initialization of 
     // io_service, sock and request are all wrong here, 
     // as we're only interested in testing if the async_write 
     // call below will compile. 
     // Don't try to run this at home! 
     boost::asio::io_service io_service; 
     tcp::socket sock(io_service); 
     boost::asio::streambuf request; 

     boost::asio::async_write(sock, request, 
      boost::bind(&Client::HandleWrite, shared_from_this(), 
       boost::asio::placeholders::error, 
       Other 
      ) 
     ); 
    } 
}; 


int main() 
{ 
    boost::shared_ptr<Client> c; 
    c->MakeTheCall(boost::bind(&Foo, _1)); 

    return 0; 
} 

這是什麼素描我猜你正在試圖做的。

正如預期的那樣,它會進行編譯,因此將它與實際做的比較可能會幫助您找到問題。

相關問題