【问题标题】:C++: Linker issue using template and boost::bindC++:使用模板和 boost::bind 的链接器问题
【发布时间】:2013-11-04 19:34:21
【问题描述】:

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

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

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

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

我正在尝试从“Server”类的方法中调用此方法,例如:

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”类作为共享库添加到编译中,因此它似乎不是这里的实际问题。请问有什么问题,我该如何解决?

【问题讨论】:

  • 代码使用boost::bind时,为什么标题要讲std::bind?这个问题有什么遗漏吗?这是一个错误吗?
  • 创建一个演示问题的最小示例。请务必包含您正在使用的编译/链接步骤。
  • 对不起,应该是 boost::bind David,我会编辑和修复这个问题。感谢您指出。

标签: c++ boost linker


【解决方案1】:

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

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

【讨论】:

  • 我确实认为是这种情况,但我还有 Timer 的其他公共成员函数,它们在调用 asyncWait() 之前被调用,它们编译和链接没有任何问题。这些函数与 asyncWait() 定义在同一个文件中,所以我不确定为什么只有 asyncWait() 无法链接。
  • 那些函数模板也是吗?应该很容易看出我的建议是否能解决您的问题,所以请试一试。 :-)
  • 那些函数不是模板。刚刚尝试将实现放在函数签名所在的标头中并且它起作用了!非常感谢!我非常困惑为什么我的头文件/源文件组合不适用于模板功能(但适用于所有其他功能)。我认为我的模板函数签名首先与 boost::bind 一起使用是错误的。
  • 我已经添加了更多解释,希望这对您有意义。
  • 是的,你的问题很有道理。很简单,因为编译器在生成机器代码时必须查看模板函数的实现(代码)。当编译器看不到实现时,它不会生成机器码。编译期间不会产生错误,因为可能有其他编译单元可能会生成所需的模板实例化。
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
相关资源
最近更新 更多