gpt4 book ai didi

c++ - 不匹配的类型 'std::chrono::_V2::steady_clock' 和 'std::chrono::_V2::system_clock'

转载 作者:行者123 更新时间:2023-12-05 03:33:01 32 4
gpt4 key购买 nike

我正在尝试在 mingw64 (GCC v11.2) 中构建我的程序。我有以下结构:

在头文件中:

struct Timer
{
std::chrono::time_point< std::chrono::steady_clock > start;
std::chrono::time_point< std::chrono::steady_clock > end;

Timer( );
~Timer( );
};

在源文件中:

util::Timer::Timer( )
: start( std::chrono::high_resolution_clock::now( ) )
{
}

util::Timer::~Timer( )
{
end = std::chrono::high_resolution_clock::now( );
std::chrono::duration< double, std::milli > duration_ms { end - start };
std::clog << "\nTimer took " << duration_ms.count( ) << " ms\n";
}

但这种情况发生了:

error: no matching function for call to 'std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >::time_point(std::chrono::_V2::system_clock::time_point)'
8 | : start( std::chrono::high_resolution_clock::now( ) )
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from pch.h:23:
c:\mingw64\include\c++\11.2.0\chrono:871:21: note: candidate: 'template<class _Dur2, class> constexpr std::chrono::time_point<_Clock, _Dur>::time_point(const std::chrono::time_point<_Clock, _Dur2>&) [with _Dur2 = _Dur2; <template-parameter-2-2> = <template-parameter-1-2>; _Clock = std::chrono::_V2::steady_clock; _Dur = std::chrono::duration<long long int, std::ratio<1, 1000000000> >]'
871 | constexpr time_point(const time_point<clock, _Dur2>& __t)
| ^~~~~~~~~~
c:\mingw64\include\c++\11.2.0\chrono:871:21: note: template argument deduction/substitution failed:
Util.cpp:8:3: note: mismatched types 'std::chrono::_V2::steady_clock' and 'std::chrono::_V2::system_clock'
8 | : start( std::chrono::high_resolution_clock::now( ) )
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

为什么会这样?如何解决?

最佳答案

感谢评论中提供的信息,我想出了以下解决方案:

在头文件中:

struct Timer
{
std::chrono::time_point< std::chrono::steady_clock > start;
std::chrono::time_point< std::chrono::steady_clock > end;

Timer( );
~Timer( );
};

在源文件中:

util::Timer::Timer( )
: start( std::chrono::steady_clock::now( ) )
{
}

util::Timer::~Timer( )
{
end = std::chrono::steady_clock::now( );
std::clog << "\nTimer took " << std::chrono::duration< double, std::milli >( end - start ).count( ) << " ms\n";
}

简而言之,我从 std::chrono::high_resolution_clock::now( ) 切换到至 std::chrono::steady_clock::now( )因为high_resolution_clock根据 high_resolution_clock 在不同的编译器上有不同的实现.
在其中一些上返回 std::chrono::time_point<std::chrono::steady_clock>在其他一些情况下,它返回 std::chrono::time_point<std::chrono::system_clock> .这给我带来了麻烦。

来自 cppreference 的注释:

Notes

The high_resolution_clock is not implemented consistently across different standard library implementations, and its use should be avoided. It is often just an alias for std::chrono::steady_clock or std::chrono::system_clock, but which one it is depends on the library or configuration. When it is a system_clock, it is not monotonic (e.g., the time can go backwards). For example, for gcc's libstdc++ it is system_clock, for MSVC it is steady_clock, and for clang's libc++ it depends on configuration.

Generally one should just use std::chrono::steady_clock or std::chrono::system_clock directly instead of std::chrono::high_resolution_clock: use steady_clock for duration measurements, and system_clock for wall-clock time.

关于c++ - 不匹配的类型 'std::chrono::_V2::steady_clock' 和 'std::chrono::_V2::system_clock',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70396570/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com