c++ - high_resolution_clock 错误 : cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’

标签 c++

如何在 C++ 中打印 high_resolution_clock

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock high_resolution_clock;

int main()
{
    std::cout << high_resolution_clock::now() << std::endl;
}

构建上述结果:

/home/greg/repositories/firstProject/main.cpp:27: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >}’)
     std::cout << high_resolution_clock::now() << std::endl;
     ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/home/greg/repositories/firstProject/main.cpp:27: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
     std::cout << high_resolution_clock::now() << std::endl;
                                             ^

看完this answer我试图遍历“容器”:

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock high_resolution_clock;

int main()
{
    for(auto i: high_resolution_clock::now()){
        std::cout << i << std::endl;
    }
}

然而,这导致了更多的错误。我还尝试使用 printf 并将 high_resolution_clock::now() 转换为 long long 但没有成功。

更新:

尝试另一个答案 suggested here也产生了更多的错误:

#include <iostream>
#include <chrono>

typedef std::chrono::high_resolution_clock high_resolution_clock;

int main()
{
    auto i = high_resolution_clock::now();
    std::cout << i.time_since_epoch() << std::endl;
}

最佳答案

非常感谢Passer By's answer中的推荐,但恐怕它不太正确。 My date librarysystem_clock 提供 I/O , 但不是 high_resolution_clock .然而Passer By's code恰好与 gcc 一起工作,因为使用该工具集 high_resolution_clocksystem_clock 的类型别名.

我正在使用 clang,并使用此工具集 high_resolution_clocksteady_clock 的类型别名(在 Visual Studio 上也是如此)。在这些平台上 Passer By's code将导致编译时错误,提示没有 operator<<找到了。

要理解这是为什么,了解 system_clock 之间的区别很重要和 steady_clock :

system_clock就像 watch (在智能手机接管地球之前戴在手腕上的东西)。它可以告诉你一天中的时间。由于没有时钟能保持完美的时间,它有时会询问另一个时钟现在几点了,并对自己进行微小的调整以保持准确。

steady_clock就像一个秒表。它非常适合为运行者计时,或为您的功能计时。它从不 self 调整,而是努力尽可能地每秒标记一秒。但它不知道现在是几点,甚至不知道一年中的哪一天。

high_resolution_clock也与任何人类日历或时间系统无关,并且允许是 typedefsystem_clocksteady_clock .在实践中,它总是一个 typedef这些时钟之一。现在你知道什么了system_clocksteady_clock是,只需使用其中之一,您的代码将更加可移植。

My librarysystem_clock 提供 I/O ,因为它的主要目的是扩展 <chrono>进入日历领域。

可以使用my library流出chrono::duration秒。所以如果你真的想要,你可以获得 duration从一个high_resolution_clock并流式传输:

#include <iostream>
#include <chrono>
#include "date.h"

typedef std::chrono::high_resolution_clock high_resolution_clock;

using date::operator<<;

int main()
{
    std::cout << high_resolution_clock::now().time_since_epoch() << std::endl;
}

这只是为我输出:

2553634286064557ns

在我的平台上,这意味着我的计算机已经启动了大约那么多纳秒。或者,如果您更喜欢可读性更高的内容:

    std::cout << date::format("%T\n", high_resolution_clock::now().time_since_epoch());

刚刚输出:

709:32:51.552928058

我的电脑已经开机了大约 709 小时 32 分钟。

<chrono>视频教程其中包括 system_clock 之间的区别和 steady_clock ,以及更多内容,请参阅:

https://www.youtube.com/watch?v=P32hvk8b13M

关于c++ - high_resolution_clock 错误 : cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46362467/

相关文章:

c++ - 简单的跨平台 TCP IP API?

java - 使用这个在构造函数中设置变量

c++ - 将数据从调用者线程传递到另一个 boost::thread 中的方法

c++ - Execvp 不执行带参数的 ping 命令

c++ - 合并功能未正确复制到 vector 中

c++ - MFC gui 可以用谷歌测试测试吗?

java - 需要有关 jni 代码的帮助(从 native 代码调用 java 方法)

python - 序列化 C++ 对象以通过套接字发送到 Python - 最佳方法?

c++ - Qt:将信号连接到具有更多参数的插槽

c++ - 是什么导致了错误 "Stack around the variable ' ' was corrupted"in my program