在C++中使用chrono库实现定时器
我正在用 <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。
我的问题是:
end的数据类型是什么,为什么它不能与start的数据类型相同?- 如何像打印
start的值那样打印end的值?
解决方案
默认的数据类型由 std::chrono::duration 和 std::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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。