提升库更新后模板函数调用不起作用

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::trim(*argv[i]);给出错误:错误:'char' 不是类、结构或联合类型 s 是变量的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。

【讨论】:

以上是关于提升库更新后模板函数调用不起作用的主要内容,如果未能解决你的问题,请参考以下文章

调用简单方法后VueJS更新Dom不起作用

WPF 调用库不起作用(线程问题)

在 Manjaro 中更新后 PostGIS 不起作用

更新面板更新()方法不起作用,如何在函数内强制刷新页面

ajax调用后tablesorter文本提取不起作用

购买完成后 UI 元素更新不起作用 - Google 计费客户端 4