2013-07-01 35 views
6

Tôi đang khám phá sự hỗ trợ cho C++ 11 trên g ++ - 4.7 (Ubuntu/Linaro 4.7.3-2ubuntu ~ 12.04, cụ thể) và tôi dường như đang tìm sự khác biệt.Tôi có nên thấy sự khác biệt đáng kể giữa std :: bind và boost :: bind không?

Cụ thể, nếu tôi nhận xét #include <boost/bind.hpp> và thay thế hệ thống số boost::bind bằng std::bind trong ví dụ ứng dụng async Boost ASIO (lấy từ http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/http/client/async_client.cpp), chương trình không còn biên dịch.

Bất kỳ lời giải thích nào về điều này?

+2

bạn có thể vui lòng thực hiện một sự thay thế nào không (tốt hơn là một sự thay thế đơn) và gửi mã đổi cùng với các lỗi biên dịch? – Praetorian

+0

Tôi nhớ đã thấy hành vi khác nhau với các liên kết lồng nhau. Không nhớ lại các chi tiết cụ thể ngay bây giờ. Tuy nhiên, đây là _not_ những gì bạn đang chạy vào đây. – sehe

Trả lời

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; 
     } 
    } 
} 

và sử dụng boost::asio::stdplaceholders::* thay vì boost::asio::placeholders::*

+0

Làm việc như một sự quyến rũ, cảm ơn rất nhiều! –

4

Có vẻ như không thể sử dụng boost::asio::placeholders cùng với std::bind. Trong ví dụ bạn đã liên kết đến, cuộc gọi đầu tiên để boost::bind xảy ra trong đoạn mã sau:

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

Đơn giản chỉ cần thay thế boost::bind với std::bind dẫn đến một loạt các sai sót. Để biên dịch, bạn cần thay thế boost::asio::placeholders bằng std::placeholders.

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

Lưu ý rằng tôi đã không xác minh rằng mã có chức năng giống nhau sau khi thực hiện các thay đổi này, chỉ biên dịch mà thôi.

Các vấn đề liên quan