C++11 c++;无法将chrono::duration添加到chrono::time\u点

C++11 c++;无法将chrono::duration添加到chrono::time\u点,c++11,chrono,C++11,Chrono,我有这个测试代码: #include <time.h> #include <stdio.h> #include <chrono> namespace chrono = std::chrono; int main() { struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); printf("time %ld.%09ld\n", ts.tv_sec, ts.tv_nse

我有这个测试代码:

#include <time.h>
#include <stdio.h>
#include <chrono>

namespace chrono = std::chrono;

int main()
{
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);

    printf("time %ld.%09ld\n", ts.tv_sec, ts.tv_nsec);

    chrono::time_point<chrono::high_resolution_clock> t(chrono::seconds(ts.tv_sec));
    t += chrono::nanoseconds(ts.tv_nsec);

    chrono::seconds secs = chrono::duration_cast<chrono::seconds>(t.time_since_epoch());
    chrono::nanoseconds nsecs = chrono::duration_cast<chrono::nanoseconds>(t.time_since_epoch() - secs);

    printf("time %ld.%09ld\n", secs.count(), nsecs.count());
}
#包括
#包括
#包括
名称空间chrono=std::chrono;
int main()
{
结构timespects;
时钟获取时间(时钟实时,&ts);
printf(“时间%ld.%09ld\n”,ts.tv\u秒,ts.tv\u nsec);
计时:时间点t(计时:秒(ts.tv_秒));
t+=chrono::纳秒(ts.tv\u nsec);
计时:秒秒秒=计时:持续时间(t.时间(从新纪元开始)();
计时::纳秒nsecs=计时::持续时间(t.时间从纪元开始()-秒);
printf(“时间%ld.%09ld\n”,secs.count(),nsecs.count());
}
它在带有g++4.7.3的Ubuntu设备上编译得很好,但在带有4.7.2的Debian 7设备上,我得到了以下编译输出:

/home/atip/chronotest.cpp: In function ‘int main()’:
/home/atip/chronotest.cpp:15:40: error: no match for ‘operator+=’ in ‘t += std::chrono::duration<long int, std::ratio<1l, 1000000000l> >((*(const long int*)(& ts.timespec::tv_nsec)))’
/home/atip/chronotest.cpp:15:40: note: candidate is:
In file included from /home/atip/chronotest.cpp:3:0:
/usr/include/c++/4.7/chrono:550:2: note: std::chrono::time_point<_Clock, _Dur>& std::chrono::time_point<_Clock, _Dur>::operator+=(const duration&) [with _Clock = std::chrono::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1l, 1000000l> >; std::chrono::time_point<_Clock, _Dur> = std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >; std::chrono::time_point<_Clock, _Dur>::duration = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]
/usr/include/c++/4.7/chrono:550:2: note:   no known conversion for argument 1 from ‘std::chrono::nanoseconds {aka std::chrono::duration<long int, std::ratio<1l, 1000000000l> >}’ to ‘const duration& {aka const std::chrono::duration<long int, std::ratio<1l, 1000000l> >&}’
/home/atip/chronotest.cpp:在函数“int main()”中:
/home/atip/chronotest.cpp:15:40:错误:“t+=std::chrono::duration(*(const long int*)(&ts.timespec::tv_nsec))中的“operator+=”不匹配”
/home/atip/chronotest.cpp:15:40:注:候选人是:
包含在/home/atip/chronotest.cpp:3:0中的文件中:
/usr/include/c++/4.7/chrono:550:2:注:std::chrono::time\u point&std::chrono::time\u point::operator++=(常数持续时间和)[带时钟=std::chrono::system\u Clock;_Dur=std::chrono::duration;std::chrono::time\u point=std::chrono::time\u point:time\u point;std::time\u point=duration=std::chrono::duration]
/usr/include/c++/4.7/chrono:550:2:注意:参数1从'std::chrono::nanoseconds{aka std::chrono::duration}'到'const duration&{aka const std::chrono::duration&}没有已知的转换

不知道如何破译它,我怎么才能让这两个都工作?最终,我有一个函数,它会得到一个timespec,我想将它转换成一个chrono::time\u点,然后再将它转换回来。

假设两个实现都是一致的

显然,在Ubuntu上,
高分辨率时钟
的分辨率是
纳秒
或更高,但在Debian 7上,
高分辨率时钟
的分辨率比
纳秒
更高。编译时错误可防止意外截断算术:

t += chrono::nanoseconds(ts.tv_nsec);
无法准确表示
纳秒

如果需要,可以通过特别请求截断来解决此问题:

t += chrono::duration_cast<chrono::high_resolution_clock::duration>(chrono::nanoseconds(ts.tv_nsec));
t+=chrono::duration\u cast(chrono::纳秒(ts.tv\u nsec));

这将向零截断。或者,您可以选择其他舍入模式,尽管您需要自己实现它们。是
chrono::duration
(搜索“round”)的一个从整数到偶数的算法示例。

Hmmm。我是否必须重新编译libstdc++6包才能启用纳秒分辨率时钟?我不知道。这可能只是因为在该平台上不可能支持纳秒分辨率。鼓励std::lib实现支持尽可能高的分辨率,并鼓励实现者这样做。但是,它通常需要操作系统的支持才能实现这一点,而这一点可能并不存在。不过,您可以在
库中编写自己的时钟。下面是我编写的一个使用Intel指令
rdtsc
实现时钟的程序。不可移植,但它与整个C++ 11 STD是可互操作的:LIB看起来像Windows 7,当使用VisualStudio 12时,默认值也不超过纳秒级,因为“高分辨率”持续时间。@ YANO:“官方文档”是C++标准,你可以在这里找到各种工作草稿:这是一本关于整个std::lib的好书,包括chrono:和一个关于chrono:的免费视频教程