我有一个问题,当我尝试访问一个lambda中的主要参数的字符串时,编译器在我尝试使用该函数调用函数时不会识别它字符串。
这是我的代码:
void removePunctuation(std::vector<std::string> &inTokens,
std::vector<std::string> &outTokens) {
std::for_each(inTokens.begin(), inTokens.end(), [outTokens](std::string s) {
std::string newS = s;
// newS.erase(std::remove_if(newS.begin(), newS.end(), ispunct));
outTokens.push_back(newS);});
}
产生以下错误:
a2.cpp:114:19: error: no matching member function for call to 'push_back'
outTokens.push_back(newS);});
当我尝试调用在其调用中使用lambda的字符串参数的函数时,我在其他函数中也遇到了这种错误。
非常感谢任何帮助!
答案 0 :(得分:5)
答案 1 :(得分:2)
除了您应该通过引用捕获cd $VENV/MyPyramidProject
sudo $VENV/bin/pip install -e .
之外,outTokens
更适合这种情况:
std::transform
如果按值传递outTokens.resize( inTokens.size() );
std::transform(inTokens.begin(), inTokens.end(), outTokens.begin(),
[](std::string s) {
s.erase(std::remove_if(s.begin(), s.end(), ispunct));
return s;
} );
,则无需创建另一个副本来修改它,并且std::string
的第一个参数应该是const引用。
答案 2 :(得分:1)
您应该通过引用捕获outTokens
:
void removePunctuation(std::vector<std::string> &inTokens,
std::vector<std::string> &outTokens) {
std::for_each(inTokens.begin(), inTokens.end(), [&outTokens](std::string s)
{
std::string newS = s;
outTokens.push_back(newS);
});
}
答案 3 :(得分:1)
除非你制作lambda mutable,否则无法修改由副本捕获的变量。
mutable - 允许body修改copy复制的参数,并调用它们的非const成员函数
除非在lambda表达式中使用了关键字mutable,否则函数调用运算符是const限定的,并且由副本捕获的对象在此
operator()
内部是不可修改的。
e.g。
[outTokens](std::string s) mutable { ... }
但这意味着您将修改outTokens
的副本,这可能不是您的意图。 (修改副本然后返回并没有多大意义。)您可能希望将其更改为通过引用捕获:
[&outTokens](std::string s) { ... }