2017-09-22 45 views
0

如何在C++中打印high_resolution_clockhigh_resolution_clock錯誤:無法綁定'std :: ostream {aka std :: basic_ostream <char>}'lvalue to'std :: basic_ostream <char> &&'

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

然而,這導致我n更多的錯誤。我也嘗試使用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; 
} 
+0

[性病::計時和cout](HTTPS的可能的複製:// stackoverflow.com/questions/7889136/stdchrono-and-cout) – user1810087

+0

@ user1810087我更新,這是在你鏈接的問題建議的代碼後。答案使用了不同的庫,該解決方案在本例中無效,因爲它導致了更多的編譯錯誤。 – GNettlefold

回答

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; 
} 

我認爲這可以解決你的問題。

+0

在你鏈接的頁面上說函數'now()'「返回high_resolution_clock幀中的當前時間點。」。如何在不進行任何計算的情況下打印此時間? – GNettlefold

+0

然後你可以使用high_resolution_clock :: now()。time_since_epoch()。count(),我想。 (該time_point類型有一個名爲計數的成員函數)對不起,我上次犯的錯 – leyanpan

+0

'.Count中()'如果在我的代碼的答案工作不工作不幸 – GNettlefold

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

有趣的事實:霍華德Hinnant(欣南特)是chrono的作者之一,並認爲他們不能直接輸出的監督/缺陷

編輯:它不能移植到輸出high_resolution_clock::time_point,請查看Howard's answer查看詳細信息

+0

謝謝你。你介意簡單解釋一下上面的代碼是如何工作的? (如果我將來遇到類似的問題) – GNettlefold

+0

如果我理解正確,'<<'是「date.h」頭文件中的一個函數,您可以使用它而不是'high_resolution_clock'的標準運算符數據類型? – GNettlefold

+1

@GNettlefold'ostream'對於'chrono'沒有'operator <<','date.h'定義了它們。爲了格式化它們,'date.h'對它們有很好的支持,檢查鏈接,應該有一些教程。 –

6

我真的很感謝Passer By's answer的推薦,不過恐怕不太對。 My date library提供了system_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_clocksteady_clock之間的區別是很重要的:

system_clock是像手錶一樣(在手腕上的東西之前,智能手機接管地球)。它可以告訴你一天的時間。而且由於沒有時鐘保持完美的時間,它有時會詢問另一個時鐘是什麼時間,並對其自身進行細微調整以保持準確。

steady_clock就像一個秒錶。對一個跑步者進行計時或者對你的功能進行計時非常有用。它從不調整自己,但力求每秒鐘儘可能地標記一秒。但它不知道一天的時間是什麼,甚至不知道一年中的哪一天。

high_resolution_clock還具有任何人類日曆或時間系統沒有關係,並且被允許爲typedef要麼system_clocksteady_clock。實際上,這些時鐘之一始終是typedef。現在你知道system_clocksteady_clock是什麼了,只需使用其中的一個,你的代碼將更加便攜。

My librarysystem_clock提供I/O,因爲它的主要目的是將<chrono>擴展到日曆領域。

可以使用my library流出chrono::duration s。所以,如果你真的想,你可以得到durationhigh_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_clocksteady_clock,和更大量之間的區別,見:

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

+0

謝謝你的驚人答案,我有一個問題是當'system_clock'進行調整時,它是否曾經「回到過去」,或者它是否試圖減速而不是提前?也就是說,順序'system_clock'嚴格增加值嗎? – GNettlefold

+3

@GNettlefold:所有''時鐘都有一個名爲'is_steady'的靜態constexpr布爾值,它解決了您的問題。如果'is_steady'是'true',那意味着時鐘永遠不會及時倒退,並且對恆定的跳動率有近似的「近似」。對於'system_clock','is_steady'的值是未指定的。所以如果您的平臺上出現錯誤,它可能不是單調的。 'steady_clock :: is_steady'必須爲true。 –

相關問題