我在C ++中使用这个lambda函数的例子有什么问题 - 编译错误?

时间:2014-12-31 19:36:18

标签: c++ lambda

我是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;
  }

};

2 个答案:

答案 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";
         };