在C++中使用chrono库实现定时器

编程语言 2026-07-09

我正在用 <chrono> 库在C++中实现一个简单的定时器。

我的代码如下:

#include <iostream>
#include <chrono>

int main()
{
    double timer;
    std::chrono::time_point <std::chrono::system_clock> start; // LINE 1

    std::cout << "Enter the duration of timer in seconds: ";
    std::cin >> timer;
    std::chrono::duration <double> timer_duration (timer);
    while (std::cin.get() != '\n');
    std::cin.clear();

    std::cout << "Press ENTER to start timer";
    while (std::cin.get() != '\n');

    start = std::chrono::system_clock::now();
    std::cout << "Timer started at " << start << std::endl;   // LINE 2
    auto end = start + timer_duration;                        // LINE 3

    while (std::chrono::system_clock::now() < end);

    std::cout << "Timer ended at " << std::chrono::system_clock::now() << std::endl;           //LINE 4

    return 0;
}

如果我把 end 在第3 行声明为与第1 行的 start 相同的数据类型,而不是使用 auto,也就是:

std::chrono::time_point <std::chrono::system_clock> start, end;

如果我按上述声明使用,而不是使用 auto,第3 行的错误信息是:

error: no match for 'operator=' (operand types are 'std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >' and 'std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<double, std::ratio<1, 1000000000> > >')
   20 |     end = start + timer_duration;                        // LINE 3
      |                   ^~~~~~~~~~~~~~
  • there are 2 candidates
In file included from /cefs/32/3279f7e93638effd41d1c096_gcc-trunk-20260513/include/c++/17.0.0/chrono:51,
                 from <source>:2:
    • candidate 1: 'constexpr std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >& std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >::operator=(const std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&)'
      /cefs/32/3279f7e93638effd41d1c096_gcc-trunk-20260513/include/c++/17.0.0/bits/chrono.h:930:13:
        930 |       class time_point
            |             ^~~~~~~~~~
      • no known conversion for argument 1 from 'std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<double, std::ratio<1, 1000000000> > >' to 'const std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&'
    • candidate 2: 'constexpr std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >& std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >::operator=(std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&&)'
      • no known conversion for argument 1 from 'std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<double, std::ratio<1, 1000000000> > >' to 'std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1, 1000000000> > >&&'

另外,我不能像打印 start 那样打印 end

我的问题是:

  1. end 的数据类型是什么,为什么它不能与 start 的数据类型相同?
  2. 如何像打印 start 的值那样打印 end 的值?

解决方案

默认的数据类型由 std::chrono::durationstd::chrono::time_point 使用,都是整数类型(具体是哪一种未指明,但通常是 int64_t)。

std::chrono::duration<double> 加到 std::chrono::system_clock::time_point 上会得到一个 std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<double>>

对于 system_clock time_points的 iostream输出运算符在浮点持续时间上被明确禁用,这也是你不能打印它的原因。

你可以通过确保 end 保持为整数持续时间来同时解决这两个问题:

std::chrono::system_clock::time_point end = start + std::chrono::duration_cast<std::chrono::system_clock::duration>(timer_duration);
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章