Не удается преобразовать std::string в тип даты

#c #date #c 11

#c #Дата #c 11

Вопрос:

Я использую библиотеку даты Говарда Хиннанта и пытаюсь преобразовать std::string в date::year_month_day , используя фрагмент кода, показанный ниже.

 #include "date.h"
#include <string>
#include <iostream>
#include <sstream>

int main()
{
  std::string d = "2016-11-23";
  std::istringstream in{d};
  date::sys_days sd;
  date::parse(in, "%F", sd);
  date::year_month_day ymd = sd;
  std::cout << ymd << 'n';
}
  

И получать слишком много ошибок с жалобами на ‘const class std::time_get<char>’ has no member named ‘get

 In file included from convert_string_to_date.cpp:1:0:
date.h: In instantiation of ‘void date::detail::parse(std::basic_istream<_CharT, _Traits>amp;, const std::basic_string<CharT, Traits>amp;, date::local_time<Duration>amp;, std::basic_string<CharT, Traits>*, std::chrono::minutes*) [with CharT = char; Traits = std::char_traits<char>; Duration = std::chrono::duration<int, std::ratio<86400l, 1l> >; date::local_time<Duration> = std::chrono::time_point<date::local_t, std::chrono::duration<int, std::ratio<86400l, 1l> > >; std::chrono::minutes = std::chrono::duration<long int, std::ratio<60l> >]’:
date.h:4371:90:   required from ‘void date::detail::parse(std::basic_istream<_CharT, _Traits>amp;, const std::basic_string<CharT, Traits>amp;, date::local_time<Duration>amp;, std::chrono::minutes*) [with CharT = char; Traits = std::char_traits<char>; Duration = std::chrono::duration<int, std::ratio<86400l, 1l> >; date::local_time<Duration> = std::chrono::time_point<date::local_t, std::chrono::duration<int, std::ratio<86400l, 1l> > >; std::chrono::minutes = std::chrono::duration<long int, std::ratio<60l> >]’
date.h:4447:42:   required from ‘void date::parse(std::basic_istream<_CharT, _Traits>amp;, const std::basic_string<CharT, Traits>amp;, date::sys_time<Duration>amp;) [with CharT = char; Traits = std::char_traits<char>; Duration = std::chrono::duration<int, std::ratio<86400l, 1l> >; date::sys_time<Duration> = std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<int, std::ratio<86400l, 1l> > >]’
date.h:4649:59:   required from ‘void date::parse(std::basic_istream<_CharT, _Traits>amp;, const CharT*, date::sys_time<Duration>amp;) [with CharT = char; Traits = std::char_traits<char>; Duration = std::chrono::duration<int, std::ratio<86400l, 1l> >; date::sys_time<Duration> = std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<int, std::ratio<86400l, 1l> > >]’
convert_string_to_date.cpp:12:27:   required from here
date.h:4192:21: error: ‘const class std::time_get<char>’ has no member named ‘get’
                     f.get(is, 0, is, err, amp;tm, b, i-1);
                     ^
date.h:4197:25: error: ‘const class std::time_get<char>’ has no member named ‘get’
                         f.get(is, 0, is, err, amp;tm, ymd, ymd 8);
                         ^
date.h:4211:21: error: ‘const class std::time_get<char>’ has no member named ‘get’
                     f.get(is, 0, is, err, amp;tm, b, i-1);
                     ^
date.h:4221:25: error: ‘const class std::time_get<char>’ has no member named ‘get’
                         f.get(is, 0, is, err, amp;tm, hm, hm 6);
                         ^
date.h:4266:25: error: ‘const class std::time_get<char>’ has no member named ‘get’
                         f.get(is, 0, is, err, amp;tm, hm, hm 2);
                         ^
date.h:4275:21: error: ‘const class std::time_get<char>’ has no member named ‘get’
                     f.get(is, 0, is, err, amp;tm, b, i-1-modified);
                     ^
date.h:4322:21: error: ‘const class std::time_get<char>’ has no member named ‘get’
                     f.get(is, 0, is, err, amp;tm, b, i-1);
                     ^
date.h:4343:17: error: ‘const class std::time_get<char>’ has no member named ‘get’
                 f.get(is, 0, is, err, amp;tm, b, e);
  

Комментарии:

1. Не удается воспроизвести: melpon.org/wandbox/permlink/xJZ67flDFWAOF7cu может быть, у вас неправильная копия date.h? Попробуйте обновить.

2. std::time_get::get требуется C 11, возможно, вам нужен переключатель компилятора для включения C 11

3. @xaxxon : Я клонировал репозиторий несколько минут назад.

4. @KarstenKoop : Я включил этот флаг. Я компилирую с использованием g -std=c 14 convert_string_to_date.cpp

5. номера строк в сообщении об ошибке не совпадают с тем, что я вижу в репозитории. Например: date.h 4183 github.com/HowardHinnant/date/blob/master/date.h#L4183

Ответ №1:

gcc 4.9 не имеет полной time_get поддержки, которая date.h требуется. Это работает на gcc 5.