【问题标题】:No match for "operator =" when using std::chrono::high_resolution_clock使用 std::chrono::high_resolution_clock 时与“operator =”不匹配
【发布时间】:2017-11-25 23:49:53
【问题描述】:

当我在下面编译这个 timer.hpp 头文件时, 编译器说:

错误:'operator=' 不匹配(操作数类型为 'std::chrono::_V2::system_clock::time_point {aka std::chrono::time_point > >}' 和 'std::__success_type > >::type {aka std::chrono::duration >}') end = std::chrono::high_resolution_clock::now() - 开始;

我猜开始和结束的变量类型是错误的。 什么是正确的类型? 我想使用std::chrono::high_resolution_clock

#include <chrono>

namespace timer{
static std::chrono::system_clock::time_point start, end;

void initTime(){
    start = std::chrono::high_resolution_clock::now();
}


void endTime(){
    end = std::chrono::high_resolution_clock::now() - start;
}

}

timer.hpp 应该与一些主文件一起使用。
通过在我要测量的某个函数之前调用timer::initTime()并在函数之后调用timer::endTime(),我会得到计时结果(这里省略了持续时间的getter)。

【问题讨论】:

标签: c++ c++11 timer chrono


【解决方案1】:

这段代码有两个问题:

static std::chrono::system_clock::time_point start, end;
/* ... */

void endTime(){
    end = std::chrono::high_resolution_clock::now() - start;
}

您将end 声明为一个时间点,但是在赋值运算符的右侧,您减去两个时间点(now()start),然后分配给end

逻辑上,如果你减去两个time points,你不会得到一个新的时间点。例如,如果我想减去“今天 08:15:00” - “今天 08:05:00”,那么将结果描述为“今天 00:10:00”是没有意义的。相反,C++ chrono 库有一个duration class template;它旨在表示时间长度(例如两个时间点之间的差异)。

在此处查看operator - 过载编号 4: http://en.cppreference.com/w/cpp/chrono/time_point/operator_arith2

我建议观看上面@Howard Hinnant 链接的教程视频... Hinnant 先生参与了std::chronoboost::chrono 库的开发。

一个潜在的问题是start 的类型为std::chrono::system_clock::time_point,它可能与std::chrono::high_resolution_clock::now() 返回的类型(类型为std::chrono::high_resolution_clock::time_point)不同(不同的时钟) )。

【讨论】:

  • Nitpick:我是 std::chrono 库的主要作者(还有其他贡献者),它是 boost::chrono 库的基础。 :-)
  • 我已经相应地改变了特征。
  • 谢谢。我的观点之一是,在这种情况下,std 先出现,boost 紧随其后。好吧,至少草稿std 排在第一位。 boost lib 可能是在 2011 年 std 进入决赛之前出现的。这对于您的好答案(我赞成)并不重要。这些只是历史花絮。
  • “今天 08:15:00”-“今天 08:05:00”=“00:10:00 01/01/1970”,而不是“今天 00:10:00”:P
猜你喜欢
  • 2014-03-23
  • 2017-09-02
  • 2017-08-31
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 2015-06-04
  • 1970-01-01
相关资源
最近更新 更多