#c #datetime #c 14 #chrono
#c #дата-время #c 14 #c -chrono
Вопрос:
Компилятор NVCC отказывается компилировать приведенный ниже код (используя .cu
расширение), поскольку он плохо обрабатывает библиотеку даты Говарда Хиннанта. NVCC вызывает GCC 6.4.0. У самого компилятора C нет никаких проблем с этим простым примером. Как я могу это решить?
#include <iostream>
#include "date.h"
int main()
{
const auto time = std::chrono::system_clock::now();
const auto daypoint = date::floor<date::days>(time);
const auto ymd = date::year_month_day{daypoint};
std::cout << ymd.year() << std::endl;
return 0;
}
../include/date.h:162:27: error: ‘const intmax_t std::__ratio_multiply<std::ratio<24l>, std::ratio<3600l> >::__gcd1’ is private within this context
using days = std::chrono::duration
^~~~~~~~
/nfs/admin/hpc/sw/RedHatEnterpriseServer7/GCCcore/6.4.0/include/c /6.4.0/ratio:289:32: note: declared private here
static const intmax_t __gcd1 =
^~~~~
Комментарии:
1. Последняя версия библиотеки (v3.0.0) должна успешно скомпилироваться с NVCC github.com/HowardHinnant/date/pull/510
Ответ №1:
Единственное, что я могу порекомендовать, это отправить отчет об ошибке в Nvidia. Вот сокращенный тестовый пример:
#include <chrono>
#include <ratio>
using days = std::chrono::duration
<int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>>;
int main() {}
Комментарии:
1. Спасибо, если это ошибка, то мой вопрос на самом деле не относится к SO. Извините, что обвиняю вашу библиотеку!
2. Не проблема. Я рад помочь разобраться в этом. Поскольку у меня нет доступа к компилятору NVCC, можете ли вы подтвердить, что мой сокращенный тестовый пример не работает с компилятором NVCC?
3. Я подтверждаю это. Это тоже не компилируется: en.cppreference.com/w/cpp/numeric/ratio/ratio_multiply кажется, что
ratio_multiply
это источник ошибки.4. Привет @HowardHinnant, я столкнулся с той же проблемой и смог обойти это, просто заменив экземпляры
std::ratio_multiply
иstd::ratio_divide
явными значениями вdate/date.h
заголовочном файле. Мне интересно, были бы вы заинтересованы в объединении, если бы я создал PR для этого обходного пути (я полностью понимаю, если ответ отрицательный, это проблема cuda, а не проблема с библиотекой дат, но было бы неплохо, чтобы библиотека работала «из коробки»)?5. Работает ли добавление
::type
к закрывающей угловой скобкеratio_multiply
?using days = std::chrono::duration <int, std::ratio_multiply<std::ratio<24>, std::chrono::hours::period>::type>;