我有这个简单的模板秒表计时器,我计划在下一个项目中使用,每当我使用“Timer< float>”实例化这个类时一切正常,但是如果我使用“Timer< int>”我收到错误。
timer.h(18):错误C2440:'':无法转换为'std :: chrono :: duration< _Rep,_Period>'到'std :: chrono :: duration< _Rep,_Period>'
我很无能为什么会发生这种情况,所有的帮助表示感谢,提前感谢!
template< typename type > class Timer
{
public:
void Start(){ m_Start = m_Time.now(); }
void Reset(){ m_Start = m_Time.now(); m_Split = m_Start; }
void Split(){ m_Split = m_Time.now(); }
type HoursSinceStart() { return std::chrono::duration< type, std::ratio< 3600 > >( m_Time.now() - m_Start ).count(); }
type MinutesSinceStart() { return std::chrono::duration< type, std::ratio< 60 > >( m_Time.now() - m_Start ).count(); }
type SecondsSinceStart() { return std::chrono::duration< type, std::ratio< 1 > >( m_Time.now() - m_Start ).count(); }
type MilliSecondsSinceStart() { return std::chrono::duration< type, std::milli >( m_Time.now() - m_Start ).count(); }
type MicroSecondsSinceStart() { return std::chrono::duration< type, std::micro >( m_Time.now() - m_Start ).count(); }
type NanoSecondsSinceStart() { return std::chrono::duration< type, std::nano >( m_Time.now() - m_Start ).count(); }
type HoursSinceSplit() { return std::chrono::duration< type, std::ratio< 3600 > >( m_Time.now() - m_Split ).count(); }
type MinutesSinceSplit() { return std::chrono::duration< type, std::ratio< 60 > >( m_Time.now() - m_Split ).count(); }
type SecondsSinceSplit() { return std::chrono::duration< type, std::ratio< 1 > >( m_Time.now() - m_Split ).count(); }
type MilliSecondsSinceSplit() { return std::chrono::duration< type, std::milli >( m_Time.now() - m_Split ).count(); }
type MicroSecondsSinceSplit() { return std::chrono::duration< type, std::micro >( m_Time.now() - m_Split ).count(); }
type NanoSecondsSinceSplit() { return std::chrono::duration< type, std::nano >( m_Time.now() - m_Split ).count(); }
private:
std::chrono::high_resolution_clock m_Time;
std::chrono::high_resolution_clock::time_point m_Start;
std::chrono::high_resolution_clock::time_point m_Split;
};
答案 0 :(得分:2)
chrono
库试图避免您在单位转换期间意外丢失信息。例如,将minutes
转换为nanoseconds
始终可以,因为nanoseconds
始终可以精确地表示任意数量的minutes
。
但nanoseconds
不会轻易转换为minutes
,因为这种转换是“有损”的。转换不准确,它会有截断(舍入)错误。如果你真的想要这样的转换,你必须明确它。这是std::chrono::duration_cast
的用途。例如:
minutes m = duration_cast<minutes>(ns);
这表示将nanoseconds
转换为minutes
,并在剩余nanoseconds
时将其截断为零。
此“安全网”仅适用于整数表示(例如int
)。当您使用基于浮点的持续时间时,允许从nanoseconds
到minutes
的隐式转换,因为浮点类型将表示来自minute
左侧nanoseconds
的分数
如果您需要除“截断为零”之外的舍入模式,here是一些实用程序。