在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*&)
我认为参数变量是引用的&#39;&amp; s&#39;对于这两个版本,为什么它会给出上面的错误?你能帮我解决一下如何更新我的代码并解释一下吗?
答案 0 :(得分:2)
这是一个模板函数,boost开发人员似乎已经预料到模板参数将从函数参数中推断出来。通过明确地提供参数,你打破了这个假设。
通过参数提供类型:
auto text = boost::property_tree::detail::trim(string{argv[i]});
这应该与旧界面和新界面兼容。
新界面的优点是它支持所有类似字符串的类,而不仅仅是从std::basic_string
派生的类。
答案 1 :(得分:1)
boost库中的detail
名称空间不是公共API的一部分 - 即。你不应该使用它们,并且绝对不依赖于它们在版本之间不改变的行为。
如果您想要修剪功能,请查看这些trim
functions provided in the Boost String Algorithms Library。