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

C++ C++;:使用模板和boost::bind的链接器问题,c++,boost,linker,C++,Boost,Linker,我正在尝试编写一个名为“Timer”的类,它围绕boost::asio::daildate\u Timer展开,并添加了使每个daildate\u Timer在其自己的线程中运行(彼此独立)的功能 不幸的是,我无法使用boost::bind调用我在自己的类中定义的typedef(下面将使我的问题更清楚) 在我的“Timer”类中,我的asyncWait()的签名如下(并调用deadline\u Timer.async\u wait()): 但是现在链接器中出现了以下错误,我不理解: error:

我正在尝试编写一个名为“Timer”的类,它围绕boost::asio::daildate\u Timer展开,并添加了使每个daildate\u Timer在其自己的线程中运行(彼此独立)的功能

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

在我的“Timer”类中,我的asyncWait()的签名如下(并调用deadline\u Timer.async\u wait()):

但是现在链接器中出现了以下错误,我不理解:

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
错误:未定义对“void Timer::asyncWait(boost::_bi::bind_t)”的引用
collect2:ld返回了1个退出状态

这是在服务器方法中调用mButton->asyncWait()时打印的。我不明白为什么它正在编译,但它无法链接。类“Timer”作为一个共享库添加到编译中,因此它似乎不是这里的实际问题。有什么问题吗?我该如何修复它?

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


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

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


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

当代码使用
boost::bind
时,为什么标题会提到
std::bind
?这个问题缺少什么吗?这是一个错误吗?创建一个演示问题的最小示例。请确保包含您正在使用的编译/链接步骤。很抱歉,这应该是boost::bind David,我将编辑并修复此问题。感谢您指出。当代码使用
boost::bind
时,为什么标题会提到
std::bind
?这个问题缺少什么吗?这是一个错误吗?创建一个演示问题的最小示例。请确保包含您正在使用的编译/链接步骤。很抱歉,这应该是boost::bind David,我将编辑并修复此问题。感谢您指出这一点。我确实认为是这样的,但我还有其他Timer的公共成员函数,它们在调用asyncWait()之前被调用,并且它们编译和链接没有任何问题。这些函数与asyncWait()定义在同一个文件中,因此我不确定为什么只有asyncWait()无法链接。这些函数也是模板吗?很容易看出我的建议是否解决了您的问题,所以请尝试一下。:-)这些函数不是模板。只是试着把实现放在函数签名所在的头文件中,结果成功了!谢谢!我非常困惑为什么我的头文件/源文件组合不适用于模板函数(但适用于所有其他函数)。首先,我认为我的模板函数签名与boost::bind一起使用是错误的。我添加了一些解释,希望这对您有意义。是的,您的问题有意义。这很简单,因为编译器在生成机器代码时必须查看模板函数的实现(代码)。当编译器看不到实现时,它将不会生成机器代码。compiletime期间不会生成错误,因为可能有其他编译单元可能会生成所需的模板实例化。我确实认为是这样,但我有其他Timer的公共成员函数,它们在调用asyncWait()之前被调用,并且编译和链接时不会出现任何问题。这些函数与asyncWait()定义在同一个文件中,因此我不确定为什么只有asyncWait()无法链接。这些函数也是模板吗?很容易看出我的建议是否解决了您的问题,所以请尝试一下。:-)这些函数不是模板。只是试着把实现放在函数签名所在的头文件中,结果成功了!谢谢!我非常困惑为什么我的头文件/源文件组合不适用于模板函数(但适用于所有其他函数)。首先,我认为我的模板函数签名与boost::bind一起使用是错误的。我添加了一些解释,希望这对您有意义。是的,您的问题有意义。这很简单,因为编译器在生成机器代码时必须查看模板函数的实现(代码)。当编译器看不到实现时,它将不会生成机器代码。compiletime期间不会生成错误,因为可能有其他编译单元可能会生成所需的模板实例化。
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