2011-08-24 56 views
3

以下是代码。为什么我不能在C++ 0x中的lambda中声明结构变量?

#include<struct.h> 
#include<iostream> 
#include<functional> 
using namespace std; 

void LambdaTest(const function <struct dummy (void)>& f) 
    { 
    struct dummy test = f(); 
    cout<<test.a<<endl; 
    } 

int main() 
    { 
    int val = 5; 
    struct dummy dum; 

    auto func = [val](void) -> struct dummy 
         { 
         dummy temp; 
         temp.a = val; 
         return temp; 
         }; 

    LambdaTest(func); 
    return 0; 
    } 

文件struct.h非常简单。

struct dummy 
    { 
    int a; 
    }; 

GCC抱怨说

lambda_struct.cpp:19:38: error: field ‘temp’ has incomplete type

这可以吗?如果是,那我该如何解决?如果不是,那为什么不呢?

编辑:

代码(被他人发现)的返回类型的错误已得到修复。

SOLUTION:

的问题是,C++ 0X标准允许定义一个新的结构(和一个类也一样,大概)中的λ定义本身的返回类型。所以如果struct关键字存在于返回类型中,编译器会认为它是一个新类型并开始抱怨。

固定的代码是

#include<struct.h> 
#include<iostream> 
#include<functional> 
using namespace std; 

void LambdaTest(const function <struct dummy (void)>& f) 
    { 
    struct dummy test = f(); 
    cout<<test.a<<endl; 
    } 

int main() 
    { 
    int val = 5; 
    struct dummy dum; 

    auto func = [val](void) -> dummy 
         { 
         dummy temp; 
         temp.a = val; 
         return temp; 
         }; 

    LambdaTest(func); 
    return 0; 
    } 
+0

我得到的错误,你的拉姆达不MSVC返回值++。 '匿名命名空间':: :: operator()':必须返回一个值。一旦我确定它编译并输出了5. – 0x5f3759df

回答

7

的问题是不正确的GCC认为你宣布在后返回一个新的结构类型,并声明不完整的类型,它是同类型的GCC认为你声明的一个领域。

还抱怨说,

error: 'temp' does not name a type

与分配行,因为它是期待一个成员声明,​​而不是一个声明。

更改为:

auto func = [val](void) -> dummy 
         { 
          struct dummy temp; 
          temp.a = val; 
          return temp; 
         }; 

会工作。

此外,提防不从函数返回一个值可能会引领你进入未定义行为的境界。

+0

这个答案解决了我的疑惑。非常感谢。 – rpg

+0

这个答案不正确。你不能在结尾返回类型中定义结构,这只是一个g ++的bug。 –

0

会发生什么,如果你拿走struct部分,只是定义变量是否正常?你知道,只是:

dummy temp; 

另外,尽量在lambda返回值摆脱其他多余struct的。说到这,你需要实际回报temp它来编译。

+0

GCC仍然不喜欢它。 – rpg

+1

令人惊讶的是,GCC(ideone)甚至没有发布关于lambda中缺少return语句的警告。它愉快地打印出'LambdaTest()'内的垃圾' – Praetorian

0

在C++,C不同,结构不放在一个单独的命名空间,所以你不必使用关键字struct在每一个声明。此外,还有在你的代码中的错误,拉姆达需要返回dummy类型的实例。下面的编译和运行如预期

#include<iostream> 
#include<functional> 
using namespace std; 

struct dummy 
    { 
    int a; 
    }; 

void LambdaTest(const function <dummy (void)>& f) 
    { 
    dummy test = f(); 
    cout<<test.a<<endl; 
    } 

int main() 
    { 
    int val = 5; 
    dummy dum; 

    auto func = [val](void) -> dummy 
         { 
         dummy temp; 
         temp.a = val; 
         return temp; // return the temp struct 
         }; 

    LambdaTest(func); 
    return 0; 
    } 

输出:

5

相关问题