我正在尝试在编译时创建一个仿函数数组,如下所示:(完整文件):
#include <functional>
using namespace std;
function< float( float tElevation, float pAzimuth )> colorFunctions[] = {
[]( float tElevation, float pAzimuth ) -> float {
return 2.0f ;
},
} ;
int main()
{
}
工作正常。 但是只要你尝试在仿函数块中创建一个局部,就像这样:
function< float( float tElevation, float pAzimuth )> colorFunctions[] = {
[]( float tElevation, float pAzimuth ) -> float {
float v = 2.0f ;
return v ;
},
} ;
您收到错误1错误C1506:不可恢复的块范围错误
如何在这些块中声明本地?它似乎不起作用。
答案 0 :(得分:0)
我可以在MSVC 2010 SP1上重现这一点。 VS10以lambda和范围的一些问题而闻名。我已经尝试了很多,但没有发现任何美丽。丑陋,丑陋的解决方法会产生一些初始化开销,但其他方法仍可按预期工作:
#include <functional>
#include <boost/assign/list_of.hpp>
#include <vector>
using namespace std;
typedef function< float( float tElevation, float pAzimuth )> f3Func;
vector<f3Func const> const colorFunctions = boost::assign::list_of(
f3Func([]( float /*tElevation*/, float /*pAzimuth*/ ) -> float {
float v = 2.0f ;
return v ;
}))
([](float a, float b) -> float {
float someFloat = 3.14f;
return a*b*someFloat;
})
;
#include <iostream>
int main()
{
cout << colorFunctions[1](0.3f,0.4f) << '\n';
}
答案 1 :(得分:-1)
我使用以下行在ubuntu 12.04上编译了以下代码:
g ++ - 4.7 -std = c ++ 0x main.cpp
它工作得很好。
你使用什么平台和什么编译器?
#include <iostream>
#include <functional>
using namespace std;
function<float (float,float)> funcs[] = {
[] (float a, float b) -> float {
float c = 2.0f;
return c;
}
};
int main() {
std::cout << funcs[0](1,2) << std::endl;
}