time_point по модулю длительность не компилируется

Окружение: win7, визуальный 2013 x64

Учитывая std::chrono::system_clock::time_point tp и std::chrono::system_clock::duration dur , как найти следующее std::chrono::system_clock::time_point tp2 следующее :

 tp2 = tp - tp % dur + dur

Это представляет собой следующую временную точку с учетом часов и сердцебиения, например, dur=10s.

Я много пробовал... думаю, лучшее, что я сделал, это:

using namespace std; // for better readability

template < class duration_t >
system_clock::time_point next_time_aligned_on(const system_clock::time_point & tp, const duration_t & step)
{
    const system_clock::duration d = tp.time_since_epoch();
    const auto step2 = duration_cast<system_clock::duration>(step);

    const auto elapsed_since_last = d % step2;

    return tp - elapsed_since_last + step;      
} 

У меня всегда была одна и та же ошибка компиляции:

1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC
\include\type_traits(1446): error C2446: ':' : no conversion from
'std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>' 
to 'std::chrono::system_clock::rep'
1>          No user-defined-conversion operator available that can perform 
this conversion, or the operator cannot be called
1>          C:\trading\tepp\src\tepp/tools/strings.h(49) : see reference 
to class template instantiation std::common_type<std::chrono::system_clock::rep,std::chrono::duration<std::chrono::system_clock::rep,std::chrono::system_clock::period>>' 
being compiled
1>          st_gammalong.cpp(30) : see reference to function template 
instantiation 'std::chrono::system_clock::time_point  
tepp::next_time_aligned_on<std::chrono::seconds>(const std::chrono::system_clock::time_point &,const duration_t &)' 
being compiled
1>          with
1>          [
1>              duration_t=std::chrono::seconds
1>          ]

Мой вопрос: как использовать оператор по модулю в С++ 11 std::chrono?


person norisknofun    schedule 30.07.2015    source источник
comment
Он компилируется с использованием clang, возможно, это связано с эта ошибка VS   -  person m.s.    schedule 30.07.2015
comment
Умный код, у меня работает на clang/libc++.   -  person Howard Hinnant    schedule 30.07.2015
comment
Ницца! Работает и с GCC (необходимо добавить с использованием пространства имен chrono;)   -  person br1    schedule 18.12.2019