Когда я компилирую хронографическое время C ++ 11, он сообщает об ошибке - PullRequest
0 голосов
/ 19 ноября 2018

код, наиболее похожий на

  uint64_t nanoseconds = 0;
  auto nano = std::chrono::nanoseconds(nanoseconds_);
  system_clock::time_point tp(nano);

Сообщение об ошибке (QNX):

time.cpp:86:35: error: no matching function for call to 'std::__1::chrono::time_point<std::__1::chrono::system_clock>::time_point(std::__1::chrono::duration<long long int, std::__1::ratio<1l, 1000000000l> >&) 
qnx700/target/qnx7/usr/include/c++/v1/chrono:769:5: note: candidate: 
template<class _Duration2> std::__1::chrono::time_point<_Clock, _Duration>::time_point(const std::__1::chrono::time_point<_Clock, _Duration2>&,
typename std::__1::enable_if<std::__1::is_convertible<_Duration2, 
_Duration>::value>::type*) time_point(const time_point<clock, _Duration2>& t,
^ qnx700/target/qnx7/usr/include/c++/v1/chrono:769:5: note: template argument 
deduction/substitution failed: time.cpp:86:35: note: 
'std::__1::chrono::duration<long long int, std::__1::ratio<1l, 1000000000l> >'
 is not derived from 'const 
 std::__1::chrono::time_point<std::__1::chrono::system_clock, _Duration2>''

Как мне объединить std::chrono::nanoseconds с time_point

Спасибо за все.

1 Ответ

0 голосов
/ 19 ноября 2018

std::chrono::time_point не имеет конструктора , который принимает произвольный тип продолжительности в качестве параметра шаблона. Конструктор, который принимает system_clock::time_point::duration, создает момент времени с его свойством time_since_epoch(), установленным в указанный аргумент, то есть созданный момент времени представляет время, которое является указанной продолжительностью после его "эпохи".

Если это ваше намерение, вы можете использовать duration_cast, чтобы привести значение наносекунды к system_clock::time_point::duration:

using namespace std::chrono;

nanoseconds nano(1234567);

system_clock::time_point time(
    duration_cast<system_clock::duration>(nano));

Или вы можете построить system_clock::time_point с длительностью ноль (то есть момент времени, представляющий эпоху), а затем добавить к этому значение вашей наносекунды; результатом является новый момент времени:

system_clock::time_point epoch;
system_clock::time_point time = epoch + nano;

Как указывает Говард Хиннант, стандарт не гарантирует какой-либо конкретной точности для std::chrono::system_clock::duration, т. Е. Системные часы не могут измерять интервалы, такие как наносекунды. В моей системе (Linux x86_64, gcc 7.3 / glibc 2.20) точность длительности составляет 1 наносекунду, но на других платформах она может составлять 1 микросекунду или меньше. На такой платформе результат duration_cast<system_clock::duration>(nanoseconds(1)) равен нулю, поскольку duration_cast округляет до нуля .

(Обратите внимание, что даже если точность равна 1 наносекунде, точность , вероятно, не равна! Это еще одна тема.)

...