私はこのテストコードを持っています:
#include <time.h>
#include <stdio.h>
#include <chrono>
namespace chrono = std::chrono;
int main()
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
printf("time %ld.%09ld\n", ts.tv_sec, ts.tv_nsec);
chrono::time_point<chrono::high_resolution_clock> t(chrono::seconds(ts.tv_sec));
t += chrono::nanoseconds(ts.tv_nsec);
chrono::seconds secs = chrono::duration_cast<chrono::seconds>(t.time_since_epoch());
chrono::nanoseconds nsecs = chrono::duration_cast<chrono::nanoseconds>(t.time_since_epoch() - secs);
printf("time %ld.%09ld\n", secs.count(), nsecs.count());
}
g++ 4.7.3 の Ubuntu ボックスでは正常にコンパイルされますが、4.7.2 の Debian 7 ボックスでは次のコンパイル出力が得られます。
/home/atip/chronotest.cpp: In function ‘int main()’:
/home/atip/chronotest.cpp:15:40: error: no match for ‘operator+=’ in ‘t += std::chrono::duration<long int, std::ratio<1l, 1000000000l> >((*(const long int*)(& ts.timespec::tv_nsec)))’
/home/atip/chronotest.cpp:15:40: note: candidate is:
In file included from /home/atip/chronotest.cpp:3:0:
/usr/include/c++/4.7/chrono:550:2: note: std::chrono::time_point<_Clock, _Dur>& std::chrono::time_point<_Clock, _Dur>::operator+=(const duration&) [with _Clock = std::chrono::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1l, 1000000l> >; std::chrono::time_point<_Clock, _Dur> = std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >; std::chrono::time_point<_Clock, _Dur>::duration = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]
/usr/include/c++/4.7/chrono:550:2: note: no known conversion for argument 1 from ‘std::chrono::nanoseconds {aka std::chrono::duration<long int, std::ratio<1l, 1000000000l> >}’ to ‘const duration& {aka const std::chrono::duration<long int, std::ratio<1l, 1000000l> >&}’
それを解読する方法がわからないのですが、これを両方で機能させるにはどうすればよいですか? 最終的に、timespec を取得する関数があり、それを chrono::time_point に変換してから、後で元に戻す必要があります。