如何同时使用boost auto_cpu_timer和progress_display?

时间:2012-10-06 14:50:17

标签: c++ boost timer

我想使用boost auto_cpu_timer来显示我的完整代码需要运行的时间。另外,我希望使用progress_display查看循环的进度。

似乎存在一个名称空间错误,因为Boost有两个计时器类,其中progress_display来自旧的,现已弃用的库。

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

仍有,有办法实现这一目标吗?以下示例显示了我正在尝试做的事情。使用AUTOPROG工作正常,但两者一起会导致错误消息。

使用g++ -lboost_timer main.cc -o time

编译

Main:

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

1 个答案:

答案 0 :(得分:6)

当您包含boost/progress.hpp时,C ++编译器会将boost::timer中定义的class timer定义为boost/timer.hppboost/progress.hpp中定义的boost/time/timer.hpp

当您包含boost::timer时,C ++编译器将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 ----- 。所以你的代码将是这样的:

{{1}}