我正在实现一个Timer,以便分配和列出花在不同类型事件上的时间。类声明如下:
#include "timer_event.h"
#include <boost/timer.hpp>
#include <vector>
class Timer {
private:
class TimedEvent;
public:
static TimedEvent* Time(TimerEvent e);
protected:
private:
class TimedEvent {
public:
TimedEvent(double seconds, TimerEvent event);
~TimedEvent();
protected:
private:
TimerEvent event_;
double seconds_;
};
static boost::timer watch_;
};
然后,在源文件中,我打算将“Time”函数实现为:
TimedEvent* Time(TimerEvent e) {
TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
return ret;
}
但是,编译器的错误消息是:
../utils/timer.cc:24:1: error: ‘TimedEvent’ does not name a type
有人可以尝试帮忙吗?
- 修订:
我修改了时间功能,现在它看起来像:
Timer::TimedEvent* Timer::Time(TimerEvent e) {
TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
return ret;
}
但是,由于“时间”在类声明中声明为静态函数。我们需要在cpp文件中声明静态对象,因为我在链接器的错误消息中得到了这个:
timer.cc:(.text+0x76): undefined reference to `Timer::TimedEvent::TimedEvent(double, TimerEvent)'
我应该在源文件中声明什么样的静态对象?
答案 0 :(得分:3)
这是编译器错误,而不是链接器错误。
据推测,你的Time
应该是这样的:
TimedEvent* Timer::Time(TimerEvent e) {
TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
return ret;
}
顺便说一下,我真的不喜欢一切都以“时间”开头!
现在,在函数内部,您可以使用TimedEvent
。但返回类型不在函数内:您必须将类型限定为Timer::TimedEvent
:
Timer::TimedEvent* Timer::Time(TimerEvent e) {
TimedEvent* ret = new TimedEvent(watch_.elapsed(),e);
return ret;
}
此外,您需要在某处定义Timer::TimedEvent
的构造函数。
答案 1 :(得分:1)
在源文件中,您应该将Time
实现为:
Timer::TimedEvent Timer::Time( TimerEvent e ) { ... }