计时码"C2440:'<function-style-cast>'中的一个奇怪错误:无法从'_CR'转换为'std :: chrono :: milliseconds'"

Vek*_*ksi 5 c++ visual-c++ c++11 c++-chrono visual-studio-2012

我偶然发现了一个奇怪的错误

C2440:'':无法从'_CR'转换为'std :: chrono :: milliseconds'

另一个问题中基本上是霍华德·亨南特的代码.

这应该在Visual Studio 2012 RC上编译吗?这个问题会是什么原因?修复或解决方法怎么样?我的目标只是创建一个简单的计时器(没有太严重),所以如果存在这种效果的东西,将采取点 - 以及其他实现提示.

有问题的代码如下.用法:

  timers::stopwatch w;
  w.start();
  std::cout << to_milliseconds(w.elapsed()) << std::endl;
Run Code Online (Sandbox Code Playgroud)

并且头文件是(为了严重性省略了实现)

namespace timers
{
    class stopwatch
    {
        public:
            typedef std::chrono::high_resolution_clock clock;
            typedef clock::time_point time_point;
            typedef clock::period period;
            typedef std::chrono::duration<float, period> duration;

            stopwatch();
            ~stopwatch();

            void start();
            void stop();
            void restart();
            void reset();

            duration elapsed() const;
       private:
            clock timer_;
            time_point start_point_;
            time_point end_point_;
            bool is_running_;

            void start_measuring();
            void stop_measuring();
     };
}

//Some convenience stuff...
namespace
{       
    long long to_milliseconds(timers::stopwatch::duration const& duration) { return   std::chrono::duration_cast<std::chrono::milliseconds>(duration).count(); }
    long long to_nanoseconds(timers::stopwatch::duration const& duration) { return std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count(); }
    long long to_seconds(timers::stopwatch::duration const& duration) { return std::chrono::duration_cast<std::chrono::seconds>(duration).count(); }
Run Code Online (Sandbox Code Playgroud)

}

编辑

按照Howard Hinnant的说明,#include <chrono>标题中包含实现文件和调用文件.该错误指向MS <chrono>标头,并在此代码中触发错误

// duration_cast
template<class _To,
    class _Rep,
    class _Period> inline
    typename enable_if<_Is_duration<_To>::value,
        _To>::type
        duration_cast(const duration<_Rep, _Period>& _Dur)
        {    // convert duration to another duration
            typedef typename ratio_divide<_Period, typename _To::period>::type _CF;
            typedef typename common_type<
            typename common_type<typename _To::rep, _Rep>::type,
                intmax_t>::type _CR;
                if (_CF::num == 1 && _CF::den == 1)
                    return (_To(static_cast<typename _To::rep>(_Dur.count())));
                else if (_CF::num != 1 && _CF::den == 1)
                    return (_To(static_cast<typename _To::rep>(static_cast<_CR>(_Dur.count())) * static_cast<_CR>(_CF::num)));
                else if (_CF::num == 1 && _CF::den != 1)
            return (_To(static_cast<typename _To::rep>(static_cast<_CR>(_Dur.count()) / static_cast<_CR>(_CF::den))));
                else
                    return (_To(static_cast<typename _To::rep>(xtatic_cast<_CR> _Dur.count()) * static_cast<_CR>(_CF::num) / static_cast<_CR>(_CF::den))));
}
Run Code Online (Sandbox Code Playgroud)

特别<chrono>是在前面提到的第573行

 [...]
 else if (_CF::num != 1 && _CF::den == 1)
     return (_To(static_cast<typename _To::rep>(static_cast<_CR>(_Dur.count())) * static_cast<_CR>(_CF::num)));
Run Code Online (Sandbox Code Playgroud)

我不能真正遵循所有代码的目的(至少),如果它在我的代码中的某个地方或VC++ <chrono>标题中有明确的意义.我认识到TC1/SC22/WG21 n2661的一些命名.无论如何,我稍后会回到计算机上,看看stopwatch它自己的项目是否会影响这个错误的发生.

编辑2

我把代码放到一个空项目中,问题仍然存在.作为补充说明,对于三个to_*秒调用,存在六个编译器错误.如果我将方便方法放在注释中,代码就会编译并运行.

嗯,我想知道什么是好的解决方法(或修复)..?

Tho*_*tit 7

我认为编译时错误是由于Visual Studio 2012 RC中的这个错误:

https://connect.microsoft.com/VisualStudio/feedback/details/752794/std-chrono-duration-cast-lacks-double-support

要解决此问题,请使用基于整数类型的持续时间而不是浮点数:

#include <cstdint>
//...
typedef std::chrono::duration<std::uint64_t, period> duration;
Run Code Online (Sandbox Code Playgroud)