2014-10-15 3 views
3

Я преобразовывал некоторый код, чтобы использовать библиотеку chrono C++ 11 вместо использования библиотеки ctime, по крайней мере частично, чтобы лучше понять хронологию библиотека. Большинство из них отлично поработали, за исключением попыток сделать разделение на две хронологические :: длительности. Я уменьшил код нарушения до простого примера, и мне потребовалось некоторое время, чтобы понять, почему это дало мне ошибку.Визуальная студия с использованием неправильной функции шаблона для chrono :: duration division

#include <chrono> 
using namespace std; 

int main() 
{ 
    chrono::milliseconds tickLength(16); 
    chrono::milliseconds futureDuration(200); 

    auto numTicks = futureDuration/tickLength; 
} 

Это должно получить доступ к функции

template<class _Rep1, 
    class _Period1, 
    class _Rep2, 
    class _Period2> inline 
    typename common_type<_Rep1, _Rep2>::type 
     operator/(
      const duration<_Rep1, _Period1>& _Left, 
      const duration<_Rep2, _Period2>& _Right) 

, но вместо этого, как представляется, пытается использовать

template<class _Rep1, 
    class _Period1, 
    class _Rep2> inline 
    typename enable_if<is_convertible<_Rep2, 
     typename common_type<_Rep1, _Rep2>::type>::value 
     && !_Is_duration<_Rep2>::value, 
     duration<typename common_type<_Rep1, _Rep2>::type, _Period1> >::type 
     operator/(
      const duration<_Rep1, _Period1>& _Left, 
      const _Rep2& _Right) 

и, таким образом, пытается определить общий тип между миллисекундах и долго долго. Выход компилятора:

1>------ Build started: Project: Playground, Configuration: Debug Win32 ------ 
1> playground.cpp 
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\type_traits(1446): error C2446: ':' : no conversion from 'std::chrono::milliseconds' to '__int64' 
1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 
1>   c:\users\XXX\documents\visual studio 2013\projects\playground\playground\playground.cpp(9) : see reference to class template instantiation 'std::common_type<__int64,std::chrono::milliseconds>' being compiled 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Я делаю что-то не так в своем коде? Это визуальная студийная проблема? Это стандартная проблема C++ 11?

+0

Временное решение, которое я использую, это просто вызвать futureDuration.count() и tickLength.count(), который работает до тех пор, пока они оба одного типа (что функционально является оператором разделения, преобразует их к одному типу, а затем называет их функции счета и делит их) – Darinth

+0

Есть ли ошибка в теле функции? Поскольку оба из них должны заменить свою подпись, а сбой замены (если неглубокий) должен вызвать смену замещения, а не ошибку. Можете ли вы включить фактическое сообщение об ошибке, а не только ту часть, которую вы считали важной? Если есть номера строк, то какая строка, на которую они ссылаются, также может быть полезна. – Yakk

+1

Это ошибка в реализации библиотеки, которая была исправлена ​​в VS "14". – bames53

ответ

2

Ваш пример кода компилируется для меня, используя clang/libC++. И ваше описание того, что должно происходить, звучит правильно для меня. Кроме того, если я распечатываю numTicks, я получаю 12, что составляет 200/16 (целочисленное деление).

Звучит как визуальная ошибка stdio для меня. Я не вижу ничего плохого в вашем коде.

 Смежные вопросы

  • Нет связанных вопросов^_^