不可恢复的块范围错误,C ++仿函数数组

时间:2012-06-30 21:46:17

标签: c++ arrays lambda c++11 functor

我正在尝试在编译时创建一个仿函数数组,如下所示:(完整文件):

#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:不可恢复的块范围错误

如何在这些块中声明本地?它似乎不起作用。

2 个答案:

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