C++11 хроно в Visual Studio 2013

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

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

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

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

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

в линуксе код работает нормально

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)    

person SangminKim    schedule 05.07.2014    source источник
comment
Как насчет того, чтобы показать нам фактическое сообщение об ошибке? (И укажите строку, где это явно встречается в коде, который вы разместили)   -  person Daniel Frey    schedule 05.07.2014
comment
Какую ошибку вы получаете?   -  person Zacrath    schedule 05.07.2014
comment
извините, я добавляю содержимое   -  person SangminKim    schedule 05.07.2014
comment
Игнорируя ошибки intellisense (которые на самом деле никогда не работают должным образом и показывают много ошибок, даже если программа правильно сформирована), эта программа отлично компилируется?   -  person Manu343726    schedule 05.07.2014
comment
Это ошибка визуальной студии, о которой следует сообщить.   -  person 101010    schedule 05.07.2014
comment
Да, это ошибка: оператор% дает длинное значение long, тогда как он должен давать продолжительность, подобную оператору+ и оператору-, в соответствии с ISO в разделе 20.13.5.5 (арифметика длительности, не относящаяся к члену).   -  person Christophe    schedule 05.07.2014


Ответы (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.

Похоже, разработчики что-то напутали с преобразованиями, я считаю, что это визуальная ошибка C++, о которой следует сообщить< /сильный>.

person 101010    schedule 05.07.2014
comment
Эта ошибка устранена и находится в VS2013 CTP Release 14. - person tom_mai78101; 12.09.2014