2012-06-30 7 views
5

Próbuję utworzyć tablicę funktorów w czasie kompilacji, w taki sposób: (kompletnej dokumentacji):Nieodwracalne błąd blok określania zakresu, tablica funktorów C++

#include <functional> 
using namespace std; 

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

int main() 
{ 
} 

To działa dobrze. Ale jak tylko próby utworzenia lokalnego wewnątrz bloku funktora, jak to:

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

Otrzymasz Error 1 error C1506: błąd określania zakresu nieodwracalny blok

Jak mogę zadeklarować mieszkańców wewnątrz tych bloków? To nie działa.

+1

Zabiłem parametry, ponieważ z nich jest nieużywany i GCC daje żadnych ostrzeżeń ani nic. Nawet z, jedynym błędem jest dla nieużywanych parametrów. – chris

+1

Czy na końcu wyrażenia lambda można umieścić ten przecinek? – coelhudo

+2

@coelhudo, To lista inicjalizatorów; [jest ważne] (http://stackoverflow.com/questions/7043372/int-a-1-2-weird-comma-allowed-any-particular-reason). Ułatwia dodawanie elementów później. – chris

Odpowiedz

-1

skompilowany z kodu w następujący ubuntu 12.04 z następujących linii:
g ++ - 4,7 -std = C++ 0x main.cpp
I działało. Jakiej platformy i jakiego kompilatora używasz?

#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

To jest komentarz –

0

Mogę odtworzyć to na MSVC 2010, SP1. VS10 jest znany z pewnych problemów z lambdami i scopingiem. Wiele próbowałem, ale nie znalazłem nic pięknego. Brzydki, brzydki obejście, które będą mieć jakiś narzut inicjalizacji ale jeszcze działać zgodnie z przeznaczeniem:

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