2012-06-30 20 views
5

Estoy intentando crear una matriz de funtores en tiempo de compilación, así: (archivo completo):error irrecuperable bloque de alcance, variedad de funtores C++

#include <functional> 
using namespace std; 

function< float(float tElevation, float pAzimuth)> colorFunctions[] = { 
    [](float tElevation, float pAzimuth) -> float { 
    return 2.0f ; 
    }, 
} ; 

int main() 
{ 
} 

que funciona bien. Pero tan pronto como se intenta crear un local, dentro del bloque funtor, así:

function< float(float tElevation, float pAzimuth)> colorFunctions[] = { 
    [](float tElevation, float pAzimuth) -> float { 
    float v = 2.0f ; 
    return v ; 
    }, 
} ; 

obtiene el error 1 error C1506: error de alcance bloque irrecuperable

¿Cómo puedo declarar los locales dentro de estos bloques? No parece funcionar.

+1

que mataron a los parámetros, ya que de ellos siendo utilizados y GCC da ninguna advertencia o nada. Incluso con, el único error es para los parámetros no utilizados. – chris

+1

¿Es válido tener esa coma al final de la expresión lambda? – coelhudo

+2

@coelhudo, es una lista de inicializadores; [es válido] (http://stackoverflow.com/questions/7043372/int-a-1-2-weird-comma-allowed-any-particular-reason). Hace que sea más fácil agregar elementos más adelante. – chris

Respuesta

-1

compilé el siguiente código en Ubuntu 12.04 con la siguiente línea:
g ++ - 4,7 -std = C++ 0x main.cpp
y funcionó bien. ¿Qué plataforma y qué compilador estás usando?

#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; 
} 
+1

Esto es un comentario –

0

Puedo reproducir esto en MSVC 2010, SP1. VS10 es conocido por algunos problemas con lambdas y scoping. He intentado mucho pero no encontré nada hermoso. Feo, feo solución que tendrá algo de sobrecarga de inicialización, pero lo demás funcionará como está previsto:

#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'; 
}