14

次のコードはコンパイルされます ( g++ 4.7.2)。

#include <chrono>

typedef std::chrono::duration< double > double_prec_seconds;
typedef std::chrono::time_point< std::chrono::system_clock > timepoint_t;

void do_something( const timepoint_t& tm )
{
    // ...
}

int main( int argc, char** argv )
{
    timepoint_t t0 = std::chrono::system_clock::now();
    timepoint_t t1 = t0 + std::chrono::seconds(3);

    // timepoint_t t3 = t0 + double_prec_seconds(3.14);
   auto t3 = t0 + double_prec_seconds(3.14);

    do_something( t1 );
}

私の問題は、どのタイプがあるかわからないことt3です。ではなくtimepoint_t、明示的に指定されたタイプの行のコメントを外すと、コンパイルされません。関数呼び出しと同じ: I can't call do_somethingwith t3.

だから私の質問は:

  • 変換が失敗するのはなぜですか?
  • 倍精度の秒数を取得する最良の方法は何ですか?

このような追加のキャストを使用できることを知っています

// this works
timepoint_t t3 = t0 + std::chrono::duration_cast< std::chrono::milliseconds >(double_prec_seconds(3.14));

しかし、私はこれを避けたいです。

前もって感謝します!

4

1 に答える 1

11

からの変換がないため、変換は失敗します。

std::chrono::time_point< std::chrono::system_clock,
                         std::chrono::system_clock::duration >

std::chrono::time_point< std::chrono::system_clock,
                         std::chrono::duration< double > >

最も簡単な方法はdouble_prec_seconds、テンプレート パラメータとしてに渡すことです。std::chrono::time_pointtime_pointを参照してください。

typedef std::chrono::time_point< std::chrono::system_clock,
                                 double_prec_seconds > timepoint_t;

と の適切なタイプがすでにありt3ますdo_something

于 2013-02-24T14:04:21.727 に答える