提升库更新后模板函数调用不起作用
Posted
技术标签:
【中文标题】提升库更新后模板函数调用不起作用【英文标题】:Template function call not working after boost library updates 【发布时间】:2016-03-24 12:15:29 【问题描述】:在Boost 1.54.0中,模板函数定义为:
template<class Ch>
std::basic_string<Ch> trim(const std::basic_string<Ch> &s,
const std::locale &loc = std::locale())
...
在 Boost 1.57.0 中,模板函数更新为:
template<class Str>
Str trim(const Str &s, const std::locale &loc = std::locale())
...
适用于 boost 1.54.0 的函数调用是:
void read_command_line(int argc,char** argv,...)
string text = boost::property_tree::detail::trim<char>(argv[i]);
现在切换到 Boot 1.57.0 后,我的实现的错误消息是:
error: no matching function for call to 'trim(char*&)
我看到两个版本的参数变量都被引用为“&s”,为什么会出现上述错误?你能帮助我如何更新我的代码并解释一下吗?
【问题讨论】:
字符串文本 = boost::property_tree::detail::trims
是变量的name,而不是type。
boost 库中的 detail
命名空间不是公共 api 的一部分 - 即。您不应该使用它们,并且绝对不要依赖它们的行为不会在版本之间发生变化。
【参考方案1】:
这是一个模板函数,boost 开发人员似乎已经预料到模板参数将从函数参数中推断出来。通过显式提供参数,您打破了这个假设。
通过参数提供类型:
auto text = boost::property_tree::detail::trim(stringargv[i]);
这应该兼容新旧界面。
新接口的优势在于它支持所有类似字符串的类,而不仅仅是那些从std::basic_string
派生的类。
【讨论】:
【参考方案2】:boost 库中的 detail
命名空间不是公共 api 的一部分 - 即。您不应该使用它们,并且绝对不要依赖它们的行为不会在版本之间发生变化。
如果您想要修剪功能,请查看这些trim
functions provided in the Boost String Algorithms Library。
【讨论】:
以上是关于提升库更新后模板函数调用不起作用的主要内容,如果未能解决你的问题,请参考以下文章