我是lambda和functors的新手。我试图运用lambda函数。
我正在尝试使用lambda函数,如下所示。但是,我在下一行收到编译错误。
auto lambda = [] ( DemoAssignOpera& val)->void
{
if (val.getPrivVar1() > 10 )
{
std::cout<<"The obj has priv1 greater than 10";
}
};
上述表达方式有什么问题?
这是编译错误 -
01:06:48 **** Incremental Build of configuration Debug for project Algorithms_STL ****
make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
../main.cpp:153:2: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
auto lambda = [] ( DemoAssignOpera& val)->void
^
../main.cpp:153:16: error: expected expression
auto lambda = [] ( DemoAssignOpera& val)->void
^
1 warning and 1 error generated.
make: *** [main.o] Error 1
01:06:48 Build Finished (took 417ms)
我正在尝试将此表达式与以下代码结合使用。
for_each(listElements.begin(),listElements.end(),lambda);
我的班级是
class DemoAssignOpera
{
private:
int priv_var1;
int priv_var2;
public:
void setDemoAssignOpera(int b1, int b2)
{
std::cout<<"Set the values"<<std::endl;
priv_var1 = b1;
priv_var2 = b2;
}
int getPrivVar1()
{
return priv_var1;
}
void showDemoAssignOpera()
{
std::cout<<"The priv_var1 = "<<priv_var1<<std::endl;
std::cout<<"The priv_var2 = "<<priv_var2<<std::endl;
}
DemoAssignOpera operator=(const DemoAssignOpera & oldObj)
{
std::cout<<"The user-defined assignment operator is invoked"<<std::endl;
priv_var1 = oldObj.priv_var1;
std::cout<<"Tweaking the assignment Operator"<<std::endl;
priv_var2 = 300;
return *this;
}
bool operator<(const DemoAssignOpera & otherbj) const
{
bool ret = false;
if(otherbj.priv_var1 > priv_var1 )
{
ret = true;
}
return ret;
}
/** This will be used by find() algorithm to match the priv_var1 **/
bool operator==(const DemoAssignOpera & oldObj) const
{
bool ret = false;
if(priv_var1 == oldObj.priv_var1 )
{
ret = true;
}
return ret;
}
};
答案 0 :(得分:3)
您正在使用C ++标准中不存在的功能,该功能在您使用的Eclipse中被选为默认值。请切换到C ++标准的C ++ 11版本来编译代码。正如dasblinkenlight所提到的,它可以编译得很好,你只需要设置正确的C ++标准版本。
对于Eclipse,请查看Eclipse FAQ,它解释了如何执行此操作: http://wiki.eclipse.org/CDT/User/FAQ#CDT_does_not_recognize_C.2B.2B11_features
您可能希望使用-std = c ++ 11而不是-std = c ++ 0x,因为它现在是正式的,但两者都应该有用。
答案 1 :(得分:0)
仿函数对象是重载()运算符的对象。在代码中使用函数对象将如下所示:
for_each(listElements.begin(),listElements.end(), CheckPrivVar);
而CheckPrivVar
将是:
struct CheckPrivVar
{
void operator() (const DemoAssignOpera& val)
{
if (val.getPrivVar1() > 10 )
std::cout<<"The obj has priv1 greater than 10";
}
};
如果你想使用lambda试试这个:
for_each(listElements.begin(),listElements.end(), [] (const DemoAssignOpera& val)
{ if (val.getPrivVar1() > 10 )
std::cout<<"The obj has priv1 greater than 10";
};