【发布时间】:2015-02-17 13:29:11
【问题描述】:
如this question 所述,boost::asio 现在可以使用 C++11 chrono 对象(如果它们可用)。但是,以下代码可以使用 clang 3.6.0-svn223366-1~exp1
编译,但不能编译#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 和 boost 很乐意使用 std::chrono
但是,叮当声:
~/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 正在尝试使用 boost::chrono 而不是 std::chrono。
这是谁的错?我猜这应该归咎于 boost,因为它具有特殊的 GCC #ifdef 标志来捕获 c++11 和 std::chrono,但是那些 #ifdefs 并没有捕获到 std::chrono 在使用 clang 时可用。我应该向谁报告这个问题?
我可以通过显式定义计时器类型来修复代码(在添加自动 std::chrono 检测之前,旧版本的 boost 需要这样做)。以下更改将在 gcc 和 clang 上编译
typedef boost::asio::basic_waitable_timer<std::chrono::steady_clock> steady_timer;
steady_timer timer(ioservice);
【问题讨论】:
标签: c++11 boost clang boost-asio