升级库更新后模板函数调用无效

时间:2016-03-24 12:15:30

标签: c++ templates boost

在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;对于这两个版本,为什么它会给出上面的错误?你能帮我解决一下如何更新我的代码并解释一下吗?

2 个答案:

答案 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