2017-06-02 7 views
1

私は、a.cppのt1_t0 = t1 - t0;と書かれた同様の型の間で、結果として生じる演算の型の宣言に関係しています。 t1およびt0は、それぞれ、最終計算時間および初期時間であり、その差は、1つの計算間の時間スパンを測定するために使用されます。私は変数boost::chrono::high_resolution_clock::time_pointstd::chrono::seconds、およびintの代わりにを関数全体に使ってみましたが、その前に関数が呼び出された後に変数を宣言するのに奇妙な問題が発生しました。ブースト::クロノタイミングメカニズムをクラスコンパイルエラーにラップしますか?

error: use of before deduction of ‘auto’コンパイルエラーと呼ばれていたので、実際のタイプを使用してプロジェクトをコンパイルしようとしましたが、今はこの問題があります。プロジェクトがint mainより上位に宣言されている場合、プロジェクトはコンパイルされます(を使用します)。ただし、クラスがヘッダーとcppファイルに分かれている場合は機能しません。

ここにプロジェクト全体がありますので、助けてください!

#include <iostream> 
#include "a.h" 

int main() 
{ 
    a A; 

    int timer = A.time(); 
    std::cout<<timer<<std::endl; 

    return 0; 
} 

これは、これはここでa.cpp

#include "a.h" 

a::a(){} 
a::~a(){} 
int a::time()//simple benchmark timer 
{ 
    boost::chrono::high_resolution_clock::time_point t0, t1, t1_t0; 
    t0 = boost::chrono::high_resolution_clock::now(); 

    //Run a process to measure time. 

    t1 = boost::chrono::high_resolution_clock::now(); 

    t1_t0 = t1 - t0;//Not sure what the resulting type is here? 

    std::chrono::seconds nsec = std::chrono::duration_cast<std::chrono::seconds>(t1_t0); 
    //Not sure what the resulting type is here? 

    return nsec.count();//Not sure what the return type is here? 
} 

あるa.h

#ifndef A_H 
#define A_H 

#include <iostream> 
#include <boost/chrono/chrono_io.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/thread/thread.hpp> 
#include <sstream> 
#include <cassert> 
#include <chrono> 

class a 
{ 
    private: 

    public: 

    a(); 
    ~a(); 
    int time(); 
}; 
#endif 

であるが、それをコンパイルエラーです。

||=== Build: Debug in return_type_auto_from_class (compiler: GNU GCC Compiler) ===| 
/home/Desktop/a.cpp||In member function ‘int a::time()’:| 
/home/Desktop/a.cpp|14|error: no match for ‘operator=’ (operand types are ‘boost::chrono::steady_clock::time_point {aka boost::chrono::time_point<boost::chrono::steady_clock>}’ and ‘boost::common_type<boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> >, boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> > >::type {aka boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> >}’)| 
/usr/include/boost/chrono/time_point.hpp|156|note: candidate: constexpr boost::chrono::time_point<boost::chrono::steady_clock>& boost::chrono::time_point<boost::chrono::steady_clock>::operator=(const boost::chrono::time_point<boost::chrono::steady_clock>&)| 
/usr/include/boost/chrono/time_point.hpp|156|note: no known conversion for argument 1 from ‘boost::common_type<boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> >, boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> > >::type {aka boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> >}’ to ‘const boost::chrono::time_point<boost::chrono::steady_clock>&’| 
/usr/include/boost/chrono/time_point.hpp|156|note: candidate: constexpr boost::chrono::time_point<boost::chrono::steady_clock>& boost::chrono::time_point<boost::chrono::steady_clock>::operator=(boost::chrono::time_point<boost::chrono::steady_clock>&&)| 
/usr/include/boost/chrono/time_point.hpp|156|note: no known conversion for argument 1 from ‘boost::common_type<boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> >, boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> > >::type {aka boost::chrono::duration<long int, boost::ratio<1l, 1000000000l> >}’ to ‘boost::chrono::time_point<boost::chrono::steady_clock>&&’| 
/home/Desktop/a.cpp|16|error: no matching function for call to ‘duration_cast(boost::chrono::steady_clock::time_point&)’| 
/usr/include/c++/5/chrono|194|note: candidate: template<class _ToDur, class _Rep, class _Period> constexpr typename std::enable_if<std::chrono::__is_duration<_Tp>::value, _ToDur>::type std::chrono::duration_cast(const std::chrono::duration<_Rep, _Period>&)| 
/usr/include/c++/5/chrono|194|note: template argument deduction/substitution failed:| 
/home/Desktop/a.cpp|16|note: ‘boost::chrono::steady_clock::time_point {aka boost::chrono::time_point<boost::chrono::steady_clock>}’ is not derived from ‘const std::chrono::duration<_Rep, _Period>’| 
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 2 second(s)) ===| 

編集されたコードは、これで元のコードに修正されています。

int a::time() 
{ 
    boost::chrono::high_resolution_clock::time_point t0, t1;//, t1_t0; 
    t0 = boost::chrono::high_resolution_clock::now(); 

    //Run a process to measure time. 
    boost::this_thread::sleep_for(boost::chrono::milliseconds{ 2000}); 

    t1 = boost::chrono::high_resolution_clock::now(); 

    auto t1_t0 = t1 - t0; 

    auto nsec = boost::chrono::duration_cast<boost::chrono::seconds>(t1_t0); 

    return nsec.count(); 
} 

答えて

2
  1. boost::chronostd::chronoを混在させないでください。どちらか一方を使用してください。 std::chronoがお使いのプラットフォームで提供され、サポートされている場合は、boost::chronoを使用することをお勧めします。

  2. time_pointの2つの違いはdurationであり、別のものはtime_pointではありません。例えば、「明日」と「今日」は、(非常に粗い精度で)時点として考えることができます。 tomorrow - today == 1 day。 1日は継続時間です。

  3. あなたはナノ秒のように、最終的な結果をしたい場合は、一生懸命しようとする必要はありません:a::time()からnanoseconds代わりのintを返す程度

    nanoseconds nsec = t1 - t0;

  4. どのように?そうすれば、クライアントには何も意味を持たないintの代わりにタイプセーフな持続時間があります。

    return t1 - t0;

+0

1.私はそれをコンパイル助け!しかし、その期間のブーストタイプは何ですか? – pandoragami

+0

Nevermind 'nanoseconds'はboostの変数型ですか? 4.私はそれを変更します。 – pandoragami

+0

戻り値の型を 'int'から' nanoseconds'に変更しようとしましたが動作しませんでした。コードを投稿しても問題ありません。上の修正を加えたコードがコンパイルされて動作します! – pandoragami

関連する問題