Visual Studio使用错误的模板函数进行chrono :: duration分割

时间:2014-10-15 00:29:24

标签: c++ c++11 visual-studio-2013 chrono

我正在转换一些代码来使用c ++ 11 chrono库而不是使用ctime库,至少部分是为了更好地理解chrono库。除了试图通过两个时间::持续时间进行除法之外,其中大部分已经变得很好。我已经将违规代码简化为一个简单的示例,我花了一段时间才弄清楚它为什么会给我错误。

#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标准问题吗?

1 个答案:

答案 0 :(得分:2)

您的示例代码使用clang / libc ++为我编译。你对应该发生的事情的描述听起来对我来说是正确的。此外,如果我打印出numTicks,我得到12,即200/16(整数除法)。

对我来说听起来像是一个视觉障碍。我认为您的代码没有任何问题。