出于练习目的,我想创建一个类似于std::transform()
:
template<class Tin, class Tout>
std::vector<Tout> map( const std::vector<Tin>& in,
const std::function<Tout(const Tin&)>& mapper ) {
std::vector<Tout> ret;
for( auto elem : in ) {
ret.push_back( mapper( in ) );
}
return ret;
}
我打算按如下方式使用它:
std::vector<Bar> bars /* = ... */;
std::vector<Foo> foos = map( bars, []( const Bar& bar ) { return bar.to_foo(); } );
但是,我得到函数调用的未定义引用。我的map()
功能的正确签名是什么?
*更新:*这是实际的错误消息(Bar = std::string
,Foo = IPv6
(自己的类))
config.cc:98:61: error: no matching function for call to ‘map(const std::vector<IPv6>&, InterfaceConfig::set_ip6(const std::vector<IPv6>&)::<lambda(const IPv6&)>)’
config.cc:98:61: note: candidate is:
utils.h:38:31: note: template<class Tin, class Tout> std::vector<Tout> utils::map(const std::vector<Tin>&, const std::function<Tout(const Tin&)>&)
这是调用: std::vector strings = utils::map( ips, []( const IPv6& ip ) { return ip.to_string(); } );