2013-02-24 10 views
6

次のコードはコンパイルしない(g++ 4.7.2)time_pointに追加:のstd ::クロノ:カスタム期間は

#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ではなく、明示的に与えられた型の行のコメントを解除するとコンパイルされません。関数呼び出しと同じ:t3do_somethingを呼び出すことはできません。

だから私の質問は以下のとおりです。

  • なぜ変換が失敗するのでしょうか?
  • 倍精度の秒の持続時間を持つ最善の方法は何ですか?

私はこの

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

のような追加キャストを使用することができます知っているが、私はこれを避けたいです。

ありがとうございます!

+1

typeid(t3).name()を使用してt3のタイプを出力し、C++ filtにstdoutをパイプし、 'std :: chrono :: time_point > 'となります。ちょうどFYI。 –

+0

ツールを使ってヒントをお願いします!私は基本的に同じことをしました。ちょうど 'C++ filt'がなくて、わかりやすい名前を除いて「役に立つ」ものは何も見つかりませんでした。 'C++ filt'は助けているようだが、それを知らなかった。 –

答えて

7

std::chrono::time_point

typedef std::chrono::time_point< std::chrono::system_clock, 
           double_prec_seconds > timepoint_t; 
を見、 time_pointにテンプレートパラメータとして double_prec_secondsを与えることであろう

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> > 

への最も簡単な方法からの変換がないため変換は、失敗しました

あなたはすでにthを持っています適切なタイプはt3およびdo_somethingです。

+0

パーフェクト!ありがとうございました!私は変換を提供しようとしましたが、私の 'typedef'を変更することは考えていませんでした。私のコードは見た目がよく、意図したように機能します。 –

関連する問題