gpt4 book ai didi

c++11 - c++ 无法将 chrono::duration 添加到 chrono::time_point

转载 作者:行者123 更新时间:2023-12-02 23:30:46 28 4
gpt4 key购买 nike

我有这个测试代码:

#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());
}

它在带有 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> >&}’

不知道如何破译它,我如何让它在两者上都起作用?最终我有一个获取 timespec 的函数,我想将其转换为 chrono::time_point,然后再将其转换回来。

最佳答案

假设两个实现都是一致的。

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

t += chrono::nanoseconds(ts.tv_nsec);

无法准确表示纳秒的事物。

如果您愿意,可以通过在需要时专门请求截断来解决此问题:

t += chrono::duration_cast<chrono::high_resolution_clock::duration>(chrono::nanoseconds(ts.tv_nsec));

这将截断为零。或者,您可以选择其他舍入模式,但您需要自己实现它们。 Herechrono::duration 的舍入到偶数算法的示例(搜索“round”)。

关于c++11 - c++ 无法将 chrono::duration 添加到 chrono::time_point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284045/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com