high_resolution_clock错误:无法将'std :: ostream {aka std :: basic_ostream <char>}'左值绑定到'std :: basic_ostream <char>&amp;&amp;'

时间:2017-09-22 10:24:23

标签: c++

如何在C ++中打印if(height=== 1080 && width=== 1920){ // your code }

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;
     ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在阅读this answer之后,我试图迭代&#34;容器&#34;:

/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;
                                             ^

然而,这导致更多错误。我还尝试使用#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()但没有成功。

更新

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

long long

3 个答案:

答案 0 :(得分:7)

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

我正在使用clang,并且使用此工具集high_resolution_clocksteady_clock的类型别名(并且在Visual Studio上同上)。在这些平台上Passer By's code将导致编译时错误,该错误导致找不到operator<<

要理解为什么会这样,了解system_clocksteady_clock之间的区别非常重要:

system_clock就像一块手表(在智能手机接管地球之前你手腕上的东西)。它可以告诉你一天中的时间。而且因为没有时钟保持完美的时间,它有时会询问另一个时钟的时间,并对其自身进行微小的调整以保持准确。

steady_clock就像秒表。这对于在跑道上计时跑步者或计时功能非常有用。它从不调整自己,但努力尽可能每秒标记一秒钟。但它不知道一天中的时间,甚至一年中的哪一天。

high_resolution_clock也与任何人类日历或时间系统无关,并且可以typedefsystem_clocksteady_clock。在实践中,它始终是这些时钟之一的typedef。既然您知道system_clocksteady_clock是什么,只需使用其中之一,您的代码就会更便携。

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

可以使用my library来流式传输chrono::duration。因此,如果您真的想要,可以从duration中获取high_resolution_clock并传输:{/ p>

#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_clocksteady_clock之间的区别,以及更多内容,请参阅:

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

答案 1 :(得分:2)

使用Howard Hinnant的date library,这是为了标准化而提出的。

#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() << std::endl;  // works!!
}

Live

有趣的事实:Howard Hinnant是chrono的作者之一,并认为他们不能直接输出监督/缺陷

编辑:输出high_resolution_clock::time_point无法移动,请查看Howard's answer了解详情

答案 2 :(得分:1)

并非所有内容都可以直接与cout一起使用。

查看cplusplus.com上this page的示例

简化版如下

// high_resolution_clock example
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>

int main()
{
    using namespace std::chrono;

    auto t1 = high_resolution_clock::now();

    //Do sth Here

    auto t2 = high_resolution_clock::now();

    duration<double> time_span = duration_cast<duration<double>>(t2 - t1);

    std::cout << "It took me " << time_span.count() << " seconds.";
    std::cout << std::endl;
    return 0;
}

我认为这可以解决您的问题。