奇妙なエラーに遭遇しました
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つのコンパイラエラーが発生します。便利なメソッドをコメントに入れると、コードがコンパイルされて実行されます。
うーん、良い回避策(または修正)は何でしょうか。