gpt4 book ai didi

C++:使用模板和 boost::bind 的链接器问题

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:10 25 4
gpt4 key购买 nike

我正在尝试编写一个名为“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”类作为共享库添加到编译中,因此它似乎不是这里的实际问题。请问哪里出了问题,我该如何解决?

最佳答案

最有可能的是,asynchWait() 的实现在您实例化函数模板的地方是不可见的。确保在您使用该函数时,该实现对编译器可见,例如通过在您声明该函数的同一 header 中实现该函数。

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

关于C++:使用模板和 boost::bind 的链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19775592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com