当前位置: 首页 > 知识库问答 >
问题:

使用std::chrono::high_resolution_clock时,“operator=”不匹配

华子航
2023-03-14

当我在下面编译这个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(),我将获得计时结果(此处省略了持续时间的getter)。

共有1个答案

易星宇
2023-03-14

这段代码有两个问题:

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 Today”-“08:05:00 Today”,那么将结果描述为“00:10:00 Today”是没有意义的。相反,C++chrono库有一个duration类模板;它旨在表示时间的长度(例如,两个时间点之间的差值)。

请参阅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)不同(不同的时钟)。

 类似资料:
  • 保持std::chrono time_point实例,然后将它们读回相同类型的另一个实例的正确方法是什么? 对写/读的调用假设time_point_t类型的实例可以以某种方式转换为字节表示,然后可以对磁盘或套接字等进行写入或读取。 Alf建议的一个可能的解决方案如下: <罢工> 注意:上面的代码有一个bug,因为最终实例化的时间点与原来的不匹配。 在旧样式time_t的情况下,通常只需根据其大小将

  • 我只想使用以下方法将时间字符串解析为: 我希望在之后获得指定时间的,但我得到了0(即)。 注意,我使用的是Howard Hinnant的日期库。

  • 我有一个regex101正确工作的regex: 有2个匹配,如预期的。 现在我想用std的regex_token_iterator拆分相同的: 这可以很好地编译,但没有任何东西被打印到stdout。 我认为正则表达式必须以其他方式编写,你能指出我的错误吗?

  • 我一直在Linux和OSX上试验各种计时器,并想尝试用std::chrono使用的相同接口包装其中一些计时器。 对于在编译时有明确定义的“周期”的定时器来说,这很容易做到,例如POSIX clock _ gettime()family、OSX上的clock_get_time() family或gettimeofday()。 然而,有些有用的计时器的“周期”(虽然是常量)只有在运行时才知道。例如:-

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 我正在尝试连接两个现有的代码库——一个在C中,另一个在C中。C代码使用std::vector,而另一个基于double数组。我想从C代码中传递double数组,对C代码中的std::vectors执行操作,并最终在double数组中反映这些操作。 有没有可能创建一个std::vector来匹配double数组占用的内存? 我已经尝试了几个选项,但是它们都涉及到创建一个新的向量和一个双向量数组的副本