C 11 chrono в Visual Studio 2013

#c #c 11 #visual-studio-2013 #chrono

#c #c 11 #visual-studio-2013 #c -chrono

Вопрос:

Я переношу код из Linux в Window.

И есть ошибка, которую я не ожидал при использовании std::chrono.

поскольку std::chrono является стандартной библиотекой C , я ожидал, что она работает без изменений.

ниже приведен код, показывающий ошибку.

ошибка возникает в тех частях, где я использую operator с экземплярами duration и функцией duration_cast duration_cast with no instance of function template .

в Linux код работает нормально

 std::string ChronoTimer::currentTime(){
    using namespace std::chrono;
    auto now = system_clock::now();
    time_point<system_clock> epoch;

    microseconds ms = duration_cast<milliseconds>(now - epoch);

    hours hour = duration_cast<hours>((ms % hours(24))   hours(9));
    minutes min = duration_cast<minutes>(ms % hours(1));
    seconds sec = duration_cast<seconds>(ms % minutes(1));
    milliseconds msec = duration_cast<milliseconds>(ms % seconds(1));


    std::stringstream strStream;
    strStream << std::setfill('0') << std::setw(2) << hour.count() << ":";
    strStream << std::setfill('0') << std::setw(2) << min.count() << ":";
    strStream << std::setfill('0') << std::setw(2) << sec.count() << ".";
    strStream << std::setfill('0') << std::setw(3)<< msec.count();
    return strStream.str();
}
  

введите описание изображения здесь

 1   IntelliSense: no instance of function template "std::chrono::duration_cast" matches the argument list
        argument types are: (<error-type>)  


2   IntelliSense: no operator " " matches these operands
        operand types are: std::chrono::system_clock::rep   std::chrono::hours  

3   IntelliSense: no instance of function template "std::chrono::duration_cast" matches the argument list
        argument types are: (std::chrono::system_clock::rep)    
  

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

1. Как насчет того, чтобы показать нам фактическое сообщение об ошибке ? (И четко укажите строку, где это происходит в опубликованном вами коде)

2. Что за ошибку вы получаете?

3. извините, что я добавляю содержимое

4. Это ошибка Visual Studio, о которой следует сообщить.

5. Да, это ошибка: operator% выдает значение long long, тогда как оно должно давать длительность, подобную operator и operator- в соответствии с ISO в разделе 20.13.5.5 (арифметика, не связанная с длительностью).

Ответ №1:

Ниже я публикую SSCCE, который посвящен вашей проблеме:

 #include <chrono>

using namespace std::chrono;

int main() {
  auto now = system_clock::now();
  time_point<system_clock> epoch;
  microseconds ms = duration_cast<milliseconds>(now - epoch);
  microseconds hs = std::chrono::hours(1);
  auto mm = ms % hs;
}
  

Хотя приведенный выше пример работает на GCCv4.9 и CLANGv3.4. Не удается скомпилировать в VS2013.

Ошибка сообщает, что VC не удается преобразовать std::chrono::microseconds в std::chrono::system_clock::rep .

Кажется, разработчики что-то путают с преобразованиями, я считаю, что это ошибка Visual C , о которой следует сообщить.

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

1. Эта ошибка устранена и находится в выпуске 14 CTP VS2013.

2. Нужно ли мне обновлять VS2019 до VS2023 или достаточно просто обновления?