#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 или достаточно просто обновления?