我已经创建了一个时间点,但我一直在努力将它打印到终端。
#include <iostream>
#include <chrono>
int main(){
//set time_point to current time
std::chrono::time_point<std::chrono::system_clock,std::chrono::nanoseconds> time_point;
time_point = std::chrono::system_clock::now();
//print the time
//...
return 0;
}
我能找到的唯一打印 time_point 的文档在这里找到: http ://en.cppreference.com/w/cpp/chrono/time_point
但是,我什至无法根据我的 time_point(如示例)创建 time_t。
std::time_t now_c = std::chrono::system_clock::to_time_t(time_point); //does not compile
错误:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono: In instantiation of ‘constexpr std::chrono::time_point<_Clock, _Dur>::time_point(const std::chrono::time_point<_Clock, _Dur2>&) [with _Dur2 = std::chrono::duration<long int, std::ratio<1l, 1000000000l> >; _Clock = std::chrono::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’:
time.cpp:13:69: required from here
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:540:32: error: no matching function for call to ‘std::chrono::duration<long int, std::ratio<1l, 1000000l> >::duration(std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >::duration)’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:540:32: note: candidates are:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:247:14: note: template<class _Rep2, class _Period2, class> constexpr std::chrono::duration::duration(const std::chrono::duration<_Rep2, _Period2>&)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:247:14: note: template argument deduction/substitution failed:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:243:46: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:240:23: note: template<class _Rep2, class> constexpr std::chrono::duration::duration(const _Rep2&)
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:240:23: note: template argument deduction/substitution failed:
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:236:27: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:234:12: note: constexpr std::chrono::duration<_Rep, _Period>::duration(const std::chrono::duration<_Rep, _Period>&) [with _Rep = long int; _Period = std::ratio<1l, 1000000l>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:234:12: note: no known conversion for argument 1 from ‘std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >::duration {aka std::chrono::duration<long int, std::ratio<1l, 1000000000l> >}’ to ‘const std::chrono::duration<long int, std::ratio<1l, 1000000l> >&’
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:232:12: note: constexpr std::chrono::duration<_Rep, _Period>::duration() [with _Rep = long int; _Period = std::ratio<1l, 1000000l>]
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../include/c++/4.7.2/chrono:232:12: note: candidate expects 0 arguments, 1 provided
原文由 Trevor Hickey 发布,翻译遵循 CC BY-SA 4.0 许可协议
(在这篇文章中,为了清楚起见,我将省略
std::chrono::
限定条件。我相信你知道它们的去向。)您的代码示例无法编译的原因是
system_clock::now()
的返回类型与您尝试将其分配给(time_point<system_clock, nanoseconds>
)的变量类型不匹配。记录的
system_clock::now()
的返回值是system_clock::time_point
,这是time_point<system_clock, system_clock::duration>
的类型定义。system_clock::duration
是实现定义的,常用的是microseconds
和nanoseconds
。您的实现似乎使用microseconds
,所以 --- 的返回类型是system_clock::now()
time_point<system_clock, microseconds>
。time_point
具有不同持续时间的 s 不能相互隐式转换,因此会出现编译器错误。您可以使用
time_point_cast
显式 转换具有不同持续时间的时间点,因此以下内容将在您的系统上编译:注意
time_point_cast
的显式模板参数是目标 持续时间 类型,而不是目标 time_point 类型。时钟类型必须在time_point_cast
中匹配,因此指定整个 time_point 类型(在时钟类型和持续时间类型上都是模板)将是多余的。当然,在您的情况下,由于您只是想打印时间点,因此不需要任何特定的分辨率,因此您可以声明
time_point
与什么类型相同system_clock::now()
返回开头。一个简单的方法是使用system_clock::time_point
typedef:由于这是 C++11,您也可以只使用
auto
:解决了这个编译器错误后,转换为
time_t
就可以了:您现在可以使用标准方法显示
time_t
值,例如std::ctime
或std::strftime
。 (正如 Cassio Neri 在对您的问题的评论中指出的那样,GCC 尚不支持更多的 C++-ystd::put_time
函数)。