2013-02-24 3 views
6

다음 코드는 컴파일 않습니다 (g++ 4.7.2) time_point에 추가 :표준 : 크로노 : 사용자 지정 기간은

#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이 아니며 명시 적으로 제공된 유형의 행을 주석 해제하면 컴파일되지 않습니다. 함수 호출과 동일 : t3으로 do_something으로 전화 할 수 없습니다.

그래서 제 질문은 다음과 같습니다

  • 왜 변환이 실패 하는가?
  • 두 배의 초 기간을 갖는 가장 좋은 방법은 무엇입니까?

는 나는이

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

같은 추가 캐스트를 사용할 수 있다는 것을 알고 있지만이를 방지하고자합니다.

미리 감사드립니다. 가장 쉬운 방법은 time_point에 템플릿 매개 변수로 double_prec_seconds을 제공하는 것입니다

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

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

로부터 변환 참조가 없기 때문에

+1

typeid (t3) .name()을 사용하여 t3 유형을 인쇄하고 C++ filt로 stdout을 파이프했으며'std :: chrono :: time_point >>. 그냥 참고하시기 바랍니다. –

+0

도구로 힌트를 주셔서 감사합니다! 나는 기본적으로'C++ filt'를 사용하지 않고 똑같은 일을했으며 암호명을 제외하고는 "유용함"을 얻지 못했습니다. 'C++ filt'가 도움이되는 것 같았습니다. –

답변

7

변환은 실패 std::chrono::time_point

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

당신은 이미 th가 있습니다. 적절한 유형은 t3이고 do_something입니다.

+0

완벽한! 고맙습니다! 변환을 제공하려고했지만'typedef '를 변경하려고 생각하지 않았습니다. 이제는 내 코드가 보이고 작동합니다. –

관련 문제