2012-06-30 7 views
5

Sto cercando di creare un array di funtori al momento della compilazione, in questo modo: (file completo):errore irreversibile blocco scoping, serie di C++ funtori

#include <functional> 
using namespace std; 

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

int main() 
{ 
} 

che funziona bene. Ma non appena si tenta di creare un locale all'interno del blocco funtore, in questo modo:

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

Si ottiene di errore 1 errore C1506: errore di scoping blocco irrecuperabile

Come posso dichiarare i locali dentro questi blocchi? Non sembra funzionare.

+1

ho ucciso i parametri a causa del loro essere inutilizzato e GCC dà nessun avviso o altro. Anche con, l'unico errore è per i parametri non utilizzati. – chris

+1

È valido avere quella virgola alla fine dell'espressione lambda? – coelhudo

+2

@coelhudo, È un elenco di inizializzazione; [è valido] (http://stackoverflow.com/questions/7043372/int-a-1-2-weird-comma-allowed-any-particular-reason). Rende più facile aggiungere elementi in seguito. – chris

risposta

-1

ho compilato il seguente codice su Ubuntu 12.04 con la seguente riga:
g ++ - 4.7 -std = C++ 0x main.cpp
e ha funzionato bene. Quale piattaforma e quale compilatore stai 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

Questo è un commento –

0

Posso riprodurlo su MSVC 2010, SP1. VS10 è noto per alcuni problemi con lambda e scoping. Ho provato molto, ma non ho trovato nulla di bello. Brutto, brutto soluzione che avrà un certo overhead di inizializzazione, ma il resto funzionare come 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'; 
}