C++11 时间点模持续时间不编译

C++11 时间点模持续时间不编译,c++11,visual-studio-2013,modulo,chrono,C++11,Visual Studio 2013,Modulo,Chrono,环境:win7,visual 2013 x64 给定一个std::chrono::system\u clock::time\u point tp,和一个std::chrono::system\u clock::dur,如何找到下一个std::chrono::system\u clock::time\u point tp2: tp2 = tp - tp % dur + dur 这表示考虑时钟和心跳的下一个时间点,例如dur=10s 我试了很多。。。我想我最好的答案是: using namesp

环境:win7,visual 2013 x64

给定一个
std::chrono::system\u clock::time\u point tp
,和一个
std::chrono::system\u clock::dur
,如何找到下一个
std::chrono::system\u clock::time\u 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;      
} 
使用命名空间std;//为了更好的可读性
模板<课程持续时间>
系统时钟::时间点下一个时间点对齐(常数系统时钟::时间点和tp、常数持续时间和步长)
{
常量系统时钟::持续时间d=tp.time_自_epoch()起;
const auto step2=持续时间(步长);
自上次运行以来的常数自动运行时间=d%step2;
返回tp-自上次+步骤以来经过的\u;
} 
我总是遇到同样的编译错误:

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>          ]
1>C:\ProgramFiles(x86)\Microsoft Visual Studio 12.0\VC
\include\type_traits(1446):错误C2446:':':没有从
'std::chrono::duration'
至“std::chrono::system_clock::rep”
1> 没有可执行的用户定义的转换运算符
无法调用此转换或运算符
1> C:\trading\tepp\src\tepp/tools/strings.h(49):参见参考
到类模板实例化std::common_type'
正在编辑
1> st_gammalong.cpp(30):参见函数模板参考
实例化'std::chrono::系统时钟::时间点
tepp::下一次校准时间(常数标准:时钟:系统时钟:时间点和常数持续时间)
正在编辑
1> 与
1>          [
1> 持续时间=标准::计时::秒
1>          ]

我的问题:如何在c++11 std::chrono中使用模运算符?

这可能与聪明的代码有关,在clang/libc++上对我有效。很好!也适用于GCC(需要添加“使用命名空间chrono;”)