2012-06-30 6 views
5

Я пытаюсь создать массив функторов во время компиляции, например, так: (полный файл):неисправимая ошибка блока обзорного массив функторов C++

#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: неисправимая ошибка кадра обзорное

Как я могу объявить местных жителей внутри этих блоков? Кажется, это не работает.

+1

Я убил параметры из-за их быть неиспользованными и GCC не дает никаких предупреждений или что-нибудь. Даже с единственной ошибкой для неиспользуемых параметров. – chris

+1

Действительно ли это запятая в конце выражения лямбда? – coelhudo

+2

@coelhudo, это список инициализаторов; [это действительно] (http://stackoverflow.com/questions/7043372/int-a-1-2-weird-comma-allowed-any-particular-reason). Это облегчает добавление элементов позже. – chris

ответ

-1

Я составил следующий код на Ubuntu 12.04 с помощью следующей строки:
г ++ - 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; 
} 
+1

Это комментарий –

0

Я могу воспроизвести это на MSVC 2010, SP1. VS10 известен некоторыми проблемами с лямбдами и областью обзора. Я много пробовал, но ничего не нашел. Гадкий, уродливый обходной путь, который будет иметь некоторые инициализации накладных расходов, но еще работать как задумано:

#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'; 
} 
Смежные вопросы