2015-03-19 3 views
1

У меня есть этот простой таймер секундомера шаблона, который я планирую использовать в моем следующем проекте, всякий раз, когда я создаю этот класс, используя «Timer < float>», все работает отлично, однако если я use "Timer < int>" Я получаю ошибки.std :: chrono :: duration integer трудности

timer.h (18): ошибка C2440: '': не удается преобразовать из 'станд :: хронометр :: Продолжительность < _Rep, _Period>' на «станд :: хроно :: длительность < _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

'std :: chrono' уже определяет« часы минут секунд »и т. Д. Вам не нужно определять их самостоятельно. – Mgetz

+0

Спасибо, что я изменил свой код, теперь он использует std :: chrono :: для всех функций для удобочитаемости! –

ответ

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 - это некоторые утилиты для этого.

 Смежные вопросы

  • Нет связанных вопросов^_^