1

我正在尝试编写一个名为“Timer”的类,它围绕 boost::asio::deadline_timer 进行包装,并具有使每个deadline_timer 在其自己的线程中运行(彼此独立)的附加功能。

不幸的是,我无法使用 boost::bind 调用我在自己的类中定义的 typedef(以下内容将使我的问题更清楚)。

在我的“定时器”类中,我的 asyncWait() 的签名如下(并调用了 deadline_timer.async_wait()):

template <typename WaitHandler>
void Timer::asyncWait(WaitHandler handler) { ... }

我试图从“服务器”类的方法中调用此方法,如下所示:

boost::scoped_ptr<Timer> mButton;
// some code
mButton->asyncWait(boost::bind(&Server::foo, this, boost::asio::placeholders::error));

用方法:

void Server::foo(const boost::system::error_code& error) { ... }

但是现在在链接器期间出现以下错误,我不明白:

error: undefined reference to 'void Timer::asyncWait<boost::_bi::bind_t<void, boost::_mfi::mf1<void, Server, boost::system::error_code const&>, boost::_bi::list2<boost::_bi::value<Server*>, boost::arg<1> (*)()> > >(boost::_bi::bind_t<void, boost::_mfi::mf1<void, Server, boost::system::error_code const&>, boost::_bi::list2<boost::_bi::value<Server*>, boost::arg<1> (*)()> >)'
collect2: ld returned 1 exit status

打印出来是为了在 Server 方法中调用 mButton->asyncWait()。我不明白为什么它正在编译,但它无法链接。“Timer”类作为共享库添加到编译中,因此它似乎不是这里的实际问题。请问有什么问题,我该如何解决?

4

1 回答 1

1

asynchWait() 的实现很可能在您实例化函数模板时不可见。确保在使用函数时编译器可以看到实现,例如通过在声明函数的同一头文件中实现函数。

说明:通常,编译器只为非模板函数生成机器代码。对于模板函数,编译器将机器代码的生成推迟到模板实例化的实际类型已知的地方。这是因为它可以在不同类型之间产生巨大的差异。对两个整数求和的代码很可能与对两个容器或向量求和的代码非常不同。

于 2013-11-04T20:33:08.580 回答