使用std::chrono::high_resolution_clock时出现“operator =”不匹配的问题

4
当我编译下面的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() - start;

我猜start和end的变量类型是错误的。正确的类型是什么?我想使用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(),就可以得到计时结果(这里省略了持续时间的获取器)。


1
这里有一个关于 chrono 的视频教程:https://www.youtube.com/watch?v=P32hvk8b13M 它解决了一些问题。 - Howard Hinnant
1个回答

8

这段代码有两个问题:

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

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

您将end声明为时间点,但在赋值运算符的右侧,您正在减去两个时间点(now()start),并将结果分配给end
从逻辑上讲,如果您要减去两个时间点,则不会得到新的时间点。例如,如果我想要减去“今天08:15:00” - “今天08:05:00”,那么将结果描述为“今天00:10:00”是没有意义的。相反,C++ chrono库有一个duration类模板;它旨在表示时间长度(例如,两个时间点之间的差异)。
请参见此处的第4个operator -重载: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)不同。

吹毛求疵一下:我是std::chrono库的主要作者(当然还有其他贡献者),这个库也是boost::chrono库的基础。 :-) - Howard Hinnant
我已经相应地更改了表述。 - NicholasM
谢谢。我的一个观点是,在这种情况下,std 先出现,然后是 boost。好吧,至少是草案的 std 先出现。Boost 库可能在 2011 年 std 最终确定之前就已经存在了。这对于你的好答案(我已经点赞了)并不重要。这些只是历史小知识。 - Howard Hinnant
"08:15:00 今天" - "08:05:00 今天" = "00:10:00 01/01/1970",而不是 "00:10:00 今天" :P - Sdra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接