2014-12-18 21 views
7

Như được ghi chú bởi this question, boost :: asio bây giờ có thể sử dụng các đối tượng chrono C++ 11 nếu chúng có sẵn. Tuy nhiên, đoạn mã sau biên dịch với nhưng không phải với kêu vang 3.6.0-svn223366-1 ~ exp1Ai thất bại, tăng cường, kêu vang, hoặc gcc? Vấn đề với std :: chrono được sử dụng với boost :: asio

#include <iostream> 
#include <boost/chrono.hpp> 
#include <boost/bind.hpp> 
#include <boost/asio.hpp> 
#include <boost/asio/steady_timer.hpp> 
#include <chrono> 
#include <thread> 
#include <functional> 

boost::asio::io_service ioservice; 
boost::asio::steady_timer timer(ioservice); 

void function() 
{ 
    std::cout << "Success" << std::endl; 
} 

int main() 
{ 
    std::thread t([&]{ ioservice.run(); }); 
    t.detach(); 

    timer.expires_from_now(std::chrono::milliseconds(10)); 
    timer.async_wait(boost::bind(&function)); 
    std::this_thread::sleep_for(std::chrono::seconds(1)); 
} 

gcc:

~/scratch$ g++ -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono 
~/scratch$ ./a.out 
Success 

gcc và tăng rất vui khi được sử dụng std :: chrono

Tuy nhiên, kêu vang:

~/scratch$ clang++-3.6 -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono 
test_asio_chrono_broken.cpp:23:8: error: no matching member function for call to 'expires_from_now' 
    timer.expires_from_now(std::chrono::milliseconds(10)); 
    ~~~~~~^~~~~~~~~~~~~~~~ 
/usr/include/boost/asio/basic_waitable_timer.hpp:414:15: note: candidate function not viable: no known conversion from 'std::chrono::milliseconds' (aka 'duration<int64_t, milli>') to 'const duration' (aka 'const duration<boost::int_least64_t, nano>') for 1st argument 
    std::size_t expires_from_now(const duration& expiry_time) 
      ^
/usr/include/boost/asio/basic_waitable_timer.hpp:387:12: note: candidate function not viable: requires 0 arguments, but 1 was provided 
    duration expires_from_now() const 
     ^
/usr/include/boost/asio/basic_waitable_timer.hpp:445:15: note: candidate function not viable: requires 2 arguments, but 1 was provided 
    std::size_t expires_from_now(const duration& expiry_time, 
      ^
1 error generated. 

boost :: ASIO đang cố gắng sử dụng tăng :: chrono thay vì std :: chrono.

Ai có lỗi ở đây? Tôi đoán rằng tăng là đổ lỗi vì nó có cờ #ifdef GCC đặc biệt để bắt C++ 11 và std :: chrono, nhưng những #ifdef đó không bắt được std :: chrono có sẵn khi sử dụng clang. Tôi sẽ báo cáo vấn đề này cho ai?

Tôi có thể sửa mã bằng cách xác định rõ ràng loại bộ hẹn giờ (theo yêu cầu của phiên bản cũ hơn trước khi tự động phát hiện :: phát hiện chrono đã được thêm). Sự thay đổi sau đây sẽ biên dịch trên cả hai gcc và kêu vang

typedef boost::asio::basic_waitable_timer<std::chrono::steady_clock> steady_timer; 
steady_timer timer(ioservice); 

Trả lời

9

các chrono documentation mô tả này Hỗ trợ

cho std :: cơ sở chrono được tự động kích hoạt cho g ++ 4.6 hoặc mới hơn, khi -std = C++ 0x hoặc -std = gnu ++ 0x compiler tùy chọn được sử dụng. (Lưu ý rằng, đối với g ++, dự thảo tiêu chuẩn monotonic_clock được sử dụng ở vị trí của steady_clock.) Hỗ trợ có thể được vô hiệu hóa bằng cách định nghĩa BOOST_ASIO_DISABLE_STD_CHRONO, hoặc rõ ràng kích hoạt cho các trình biên dịch khác bằng cách định nghĩa BOOST_ASIO_HAS_STD_CHRONO.

Sự nhấn mạnh thêm là của tôi. Điều đó nói rằng, bạn có thể có được điều này làm việc sử dụng kêu vang bằng cách định nghĩa một cách rõ ràng BOOST_ASIO_HAS_STD_CHRONO

clang++ -D BOOST_ASIO_HAS_STD_CHRONO -std=c++11 test_asio_chrono_broken.cpp -lpthread -lboost_system -lboost_chrono 

Tôi không biết nếu có được ưu tiên hỗ trợ vang cho các công cụ như thế này trong thư viện tăng khác, vui lòng file a bug.

+0

Lỗi được gửi (dưới dạng yêu cầu tính năng). – ilektron

+0

@ilektron, bạn có liên kết đến yêu cầu bạn đã tạo/tìm thấy tiện dụng không? – chwarr

+2

https://svn.boost.org/trac/boost/ticket/10884 – ilektron

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