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);
Lỗi được gửi (dưới dạng yêu cầu tính năng). – ilektron
@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
https://svn.boost.org/trac/boost/ticket/10884 – ilektron