2017-02-23 11 views
1

私はこのコンパイラエラーの乗車を取得する方法を確認していない。ここでバイナリ '> =': 'のstd ::クロノ:: SYSTEM_CLOCK :: time_point'

error C2676: binary '>=': 'std::chrono::system_clock::time_point' 
#include <ctime> 
#include <chrono> 

int main() 
{ 
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); 
    std::time_t now_c = std::chrono::system_clock::to_time_t(now - std::chrono::hours(24)); 

    if (std::chrono::system_clock::now() >= now_c) 
    { 

    } 
} 

は何ですかコンパイラの出力:

1>------ Build started: Project: test, Configuration: Debug x64 ------ 
1> Source.cpp 
1>d:\dev\cpptests\test\test\source.cpp(25): error C2784: 'bool std::operator >=(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)': could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'std::chrono::system_clock::time_point' 
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\utility(311): note: see declaration of 'std::operator >=' 
1>d:\dev\cpptests\test\test\source.cpp(25): error C2784: 'bool std::chrono::operator >=(const std::chrono::duration<_Rep,_Period> &,const std::chrono::duration<_Rep2,_Period2> &)': could not deduce template argument for 'const std::chrono::duration<_Rep,_Period> &' from 'std::chrono::system_clock::time_point' 
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\chrono(538): note: see declaration of 'std::chrono::operator >=' 
1>d:\dev\cpptests\test\test\source.cpp(25): error C2784: 'bool std::chrono::operator >=(const std::chrono::time_point<_Clock,_Duration> &,const std::chrono::time_point<_Clock,_Duration2> &)': could not deduce template argument for 'const std::chrono::time_point<_Clock,_Duration2> &' from 'time_t' 
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\chrono(905): note: see declaration of 'std::chrono::operator >=' 
1>d:\dev\cpptests\test\test\source.cpp(25): error C2676: binary '>=': 'std::chrono::system_clock::time_point' does not define this operator or a conversion to a type acceptable to the predefined operator 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+1

さて、あなたは直接(旧Cの土地からである) 'time_t'と'クロノ:: SYSTEM_CLOCK :: time_point'を比較することはできません。なぜ、 'time_point'型の' now_c'を作りませんか? – yeputons

答えて

5

この種のケースでは、コードをもっとはっきりさせるために、自動でタイプ控除を使用することをお勧めします。また、上記のコメントのように、std :: chronoの施設は、c-styleのtime_tと直接互換性がありません。 std :: chronoをそのまま使用することをお勧めします。

#include <ctime> 
#include <chrono> 
#include <iostream> 

int main() 
{ 
    auto now = std::chrono::system_clock::now(); 
    auto now_c = now - std::chrono::hours(24); 

    if (std::chrono::system_clock::now() >= now_c) 
    { 
    std::cout << "it works!" << std::endl; 
    } 
    return 0; 
} 
1

あなたはは、C時間で C++ time_pointを比較しようとしています!そして比較するオペレータ>=はありません。次に、nanosecondsecond
とを比較しようとします。time_pointは、time_since_epochという名前の関数を使用できます。
autoを使用すると、問題の解決に役立ちますが、何が起きているのか理解できていないことがあります。
ですから、単純に比較することができます(良くない):
if (now.time_since_epoch().count() >= now_c)

そしてより良いコードは次のとおりです。time_tsecond


if (now.time_since_epoch().count() >= now_c){ 
    std::cout << now.time_since_epoch().count() << '\n'; 
    std::cout << std::chrono::duration_cast< std::chrono::seconds>(now.time_since_epoch()).count() << '\n'; 
    std::cout << now_c << '\n'; 
    } 
あたりにある
std::chrono::duration_cast< std::chrono::seconds>(now.time_since_epoch()).count()

ので

出力:

1487879248873636085 
1487879248 
1487792848 
関連する問題