这是代码。
#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;
};
海湾合作委员会抱怨说
lambda_struct.cpp:19:38:错误:字段'temp'的类型不完整
这是允许的吗?如果是,那我该如何解决呢?如果没有,那为什么不呢?
修改
代码中的返回类型错误(由他人发现)现已修复。
SOLUTION:
问题是C ++ 0x标准允许在lambda定义本身的返回类型中定义一个新结构(也可能是一个类)。因此,如果返回类型中存在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 :(得分:7)
问题是GCC错误地认为你在尾随的返回上声明了一个新的结构类型,它声明了一个不完整类型的字段,它与GCC认为你声明的类型相同。
它也抱怨
错误:'temp'没有命名类型
在具有赋值的行上,因为它期待成员声明,而不是声明。
更改为:
auto func = [val](void) -> dummy
{
struct dummy temp;
temp.a = val;
return temp;
};
会工作。
另外,请注意,不从函数返回值可能会导致您进入未定义行为的范围。
答案 1 :(得分:0)
如果你拿走struct
部分并正常定义变量会怎样?你知道,只是:
dummy temp;
另外,尝试删除lambda返回值中的其他多余的struct
。说到这一点,你需要实际返回 temp
来进行编译。
答案 2 :(得分:0)
在C ++中,与C不同,结构不会放在单独的命名空间中,因此您不必在每个声明中使用关键字struct
。此外,代码中存在错误,lambda需要返回类型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