2

auto_cpu_timerBoostを使用して、完全なコードを実行する必要がある時間を表示したいと思います。さらに、を使用してループの進行状況を確認したいと思いますprogress_display

Boostには2つのタイマークラスがありprogress_display、古い、現在は非推奨のライブラリからのものであるため、名前空間の競合があるようです。

http://www.boost.org/doc/libs/1_51_0/libs/timer/doc/index.html

それでも、これを達成する方法はありますか?次の例は、私がやろうとしていることを示しています。またはのいずれAUTOかを使用するとPROG正常に機能しますが、両方を一緒に使用するとエラーメッセージが表示されます。

メイン:でコンパイルg++ -lboost_timer main.cc -o time

#define AUTO
#define PROG

#ifdef  PROG
#include <boost/progress.hpp>
#endif     //----  PROG  -----

#ifdef  AUTO
#include <boost/timer/timer.hpp>
#endif     //----  AUTO  -----

#include <cmath>

int main()
{
#ifdef  AUTO
    boost::timer::auto_cpu_timer t;
#endif     //----  AUTO  -----

    long loops = 100000000;

#ifdef  PROG
    boost::progress_display pd( loops );
#endif     //----  PROG  -----

    //long loop to burn some time
    for (long i = 0; i < loops; ++i)
    {
        std::sqrt(123.456L);
#ifdef  PROG
        ++pd;
#endif     //----  PROG  -----
    }

    return 0;
}

エラーログ:

/usr/include/boost/timer/timer.hpp:38:1: error: ‘namespace boost::timer { }’ redeclared as different kind of symbol
/usr/include/boost/timer.hpp:45:1: error: previous declaration of ‘class boost::timer’
/usr/include/boost/timer/timer.hpp: In member function ‘std::string boost::timer::cpu_timer::format(short int, const std::string&) const’:
/usr/include/boost/timer/timer.hpp:74:34: error: ‘format’ is not a member of ‘boost::timer’
/usr/include/boost/timer/timer.hpp: In member function ‘std::string boost::timer::cpu_timer::format(short int) const’:
/usr/include/boost/timer/timer.hpp:76:34: error: ‘format’ is not a member of ‘boost::timer’
main.cc: In function ‘int main()’:
main.cc:17:2: error: ‘auto_cpu_timer’ is not a member of ‘boost::timer’
main.cc:17:31: error: expected ‘;’ before ‘t’
4

1 に答える 1

6

をインクルードするboost/progress.hppと、C++ コンパイラは、 にインクルードされている で定義されboost::timerている の定義を認識します。class timerboost/timer.hppboost/progress.hpp

を含めるboost/time/timer.hppと、C++ コンパイラは の別の定義をboost::timer名前空間として認識し、これがエラーの原因です。

本当に使いたい場合は、解決策はboost::timerマクロを使用して名前を変更することです。ただしnamespace boost::timer、ヘッダーの外側に実装されている関数 ( などstd::string format(const cpu_times& times, short places, const std::string& format)) が含まれているため、名前を変更する必要がありますclass boost::timer。したがって、コードは次のようになります。

#ifdef  PROG
#define timer   timer_class
#include <boost/progress.hpp>
#undef timer
#endif     //----  PROG  -----

#ifdef  AUTO
#include <boost/timer/timer.hpp>
#endif     //----  AUTO  -----
于 2012-10-06T15:09:32.243 に答える