Нет совпадения для operator = при использовании std :: chrono :: high_resolution_clock

Когда я скомпилировал этот заголовочный файл timer.hpp ниже, компилятор сказал:

ошибка: нет совпадения для 'operator =' (типы операндов: 'std :: chrono :: _ V2 :: system_clock :: time_point {aka std :: chrono :: time_point>>}' и 'std :: __ success_type>> :: type {aka std :: chrono :: duration>} ') end = std :: chrono :: high_resolution_clock :: now () - начало;

Я предполагаю, что тип переменной для начала и конца неправильный. Какой правильный тип? Я хочу использовать std::chrono::high_resolution_clock.

#include <chrono>

namespace timer{
static std::chrono::system_clock::time_point start, end;

void initTime(){
    start = std::chrono::high_resolution_clock::now();
}


void endTime(){
    end = std::chrono::high_resolution_clock::now() - start;
}

}

timer.hpp должен использоваться с некоторым основным файлом.
Вызывая timer::initTime() перед некоторой функцией, которую я хочу измерить, и вызывая timer::endTime() после функции, я бы получил результат синхронизации (получатель (время здесь опущено).


person mallea    schedule 22.06.2017    source источник
comment
Вот видеоурок для chrono: youtube.com/watch?v=P32hvk8b13M It решает такие проблемы.   -  person Howard Hinnant    schedule 22.06.2017


Ответы (1)


С этим кодом есть две проблемы:

static std::chrono::system_clock::time_point start, end;
/* ... */

void endTime(){
    end = std::chrono::high_resolution_clock::now() - start;
}

Вы объявляете end как точку времени, но затем в правой части оператора присваивания вы вычитаете две точки времени (now() и start) и присваиваете end.

По логике вещей, если вы вычтите два временных точек, вы не получите новое время точка. Например, если бы я хотел вычесть «08:15:00 сегодня» - «08:05:00 сегодня», было бы бессмысленно описывать результат как «00:10:00 сегодня». Вместо этого в библиотеке C ++ chrono есть duration шаблон класса; он предназначен для представления отрезков времени (например, разницы между двумя временными точками).

См. operator - перегрузку номер 4 здесь: http://en.cppreference.com/w/cpp/chrono/time_point/operator_arith2

Я предлагаю посмотреть обучающее видео, которое @Howard Hinnant связал с выше ... Г-н Хиннант участвовал в разработке библиотек std::chrono и boost::chrono.

Потенциальная вторая проблема заключается в том, что start имеет тип std::chrono::system_clock::time_point, который может иметь другой тип (другие часы), чем тип, возвращаемый std::chrono::high_resolution_clock::now() (имеющий тип std::chrono::high_resolution_clock::time_point).

person NicholasM    schedule 22.06.2017
comment
Нитпик: Я ведущий автор (были и другие участники) библиотеки std::chrono, которая послужила основой для библиотеки boost::chrono. :-) - person Howard Hinnant; 25.06.2017
comment
Соответственно, я изменил характеристику. - person NicholasM; 27.06.2017
comment
Спасибо. Одно из моих замечаний заключается в том, что в данном случае сначала идет std, а затем boost. Ну, по крайней мере, черновик std был первым. Boost lib, вероятно, появился до того, как std стал финальным в 2011 году. Это не очень важно для вашего хорошего ответа (который я поддержал). Это всего лишь исторические лакомые кусочки. - person Howard Hinnant; 27.06.2017