【发布时间】:2011-01-14 09:02:31
【问题描述】:
我目前一直在寻找修剪 std::vector 中每个字符串的正确语法。
我试过了
std::vector<std::string> v;
std::for_each(v.begin(), v.end(), &boost::trim);
这在 MSVC7.1 中给了我以下错误消息。
错误 C2784:“_Fn1 std::for_each(_InIt,_InIt,_Fn1)”:无法使用 [_Ty=std:: 从“std::vector<_ty>::iterator”推导出“T1”的模板参数string] : 见 'std::for_each' 的声明
错误 C2896: '_Fn1 std::for_each(_InIt,_InIt,_Fn1)' : 不能使用函数模板 'void boost::algorithm::trim(SequenceT &,const std::locale &)' 作为函数参数: 见'boost::algorithm::trim'的声明
如果我显式地给模板参数 trims 第二个参数,编译器是找不到的,虽然它是默认设置的。
std::for_each(v.begin(), v.end(), &boost::trim<std::string>);
错误 C2198: 'void (__cdecl *)(std::string &,const std::locale &)' : 通过函数指针调用的参数太少
我想知道为v 中的每个元素调用 trim 的正确语法是什么样的。
【问题讨论】:
-
还要注意
for_each不用于修改原始序列。请改用transform。 -
错了,for_each 非常适合他的工作。请记住 boost::trim 返回 void,这意味着它不能与 transform 一起使用。
-
难道就没有针对这种情况的 boost::trim_copy 吗?
-
是的,除了首先没有情况:OP 对 for_each 的使用很好。请参阅此相关主题:stackoverflow.com/questions/662845/…
-
@Diego:反过来。
transform旨在是不可变的,这就是为什么它需要一个目标迭代器。