【问题标题】:binary '>=': 'std::chrono::system_clock::time_point'二进制 '>=': 'std::chrono::system_clock::time_point'
【发布时间】:2017-02-23 08:54:23
【问题描述】:

我不确定如何解决这个编译器错误:

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 ==========

【问题讨论】:

  • 好吧,你不能直接比较time_t(来自旧的C语言)和chrono::system_clock::time_point。为什么不将now_c 设为time_point 类型?

标签: c++ c++11 visual-studio-2015 chrono


【解决方案1】:

对于这种情况,我建议您使用带有 auto 的类型推导,因为它使代码更清晰。此外,正如上面的 cmets 所述,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;
}

【讨论】:

    【解决方案2】:

    您正在尝试比较一个 C++ time_point 和一个 C 时间!并且没有运营商&gt;= 可以比较。然后您尝试将nanosecondsecond 进行比较
    time_point 有一个名为time_since_epoch 的函数,您可以使用它。
    使用 auto 可以帮助解决问题,但不了解会发生什么以及幕后情况!
    所以你可以简单地比较(不好):
    if ( now.time_since_epoch().count() &gt;= now_c)

    更好的代码是:
    std::chrono::duration_cast&lt; std::chrono::seconds&gt;(now.time_since_epoch()).count()

    因为time_t 是每个second


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

    输出:

    1487879248873636085
    1487879248
    1487792848
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2018-07-27
      • 2020-10-13
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多