5

奇妙なエラーに遭遇しました

C2440:'':'_CR'から'std :: chrono::milliseconds'に変換できません

基本的に、別の質問のハワード・ヒナントのコードに相当します。

これはVisualStudio2012 RCでコンパイルする必要がありますか?この問題の理由は何でしょうか?修正または回避策はどうですか?私の目的は、単純なタイマー(それほど深刻なものではない)を作成することです。そのため、その効果に何かが存在する場合は、他の実装の手がかりと同様に、ポイントが取得されます。

問題のコードは次のとおりです。使用法:

  timers::stopwatch w;
  w.start();
  std::cout << to_milliseconds(w.elapsed()) << std::endl;

そして、ヘッダーファイルは(簡潔にするために実装は省略されています)

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(); }

}

編集

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))));
}

具体的には、の573行目<chrono>で、前述のとおりです。

 [...]
 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)));

そのコードのすべての目的に(少なくとも)それが私のコードのどこかにあるか、VC ++<chrono>ヘッダーにある場合、明確な意見を持つことはできません。TC1 / SC22 /WG21n2661からの命名の一部を認識しています。いずれにせよ、後でコンピューターに戻って、をstopwatch独自のプロジェクトに分離すると、このエラーの発生に影響するかどうかを確認します。

編集2

私はコードを空のプロジェクトに入れましたが、問題はまだあります。追記として、3回のto_ * seconds呼び出しでは、6つのコンパイラエラーが発生します。便利なメソッドをコメントに入れると、コードがコンパイルされて実行されます。

うーん、良い回避策(または修正)は何でしょうか。

4

2 に答える 2

7

コンパイル時のエラーは、Visual Studio2012RCのこのバグが原因だと思います。

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;
于 2012-09-02T11:07:13.047 に答える
0

私が追加した場合、あなたのコードは私のためにコンパイルされます:

#include <chrono>

それに。Visual Studio 2012 RCにアクセスできないため、このエラーの原因を調査することも、発生している場所を確認することもできません。

于 2012-09-02T00:14:46.567 に答える