Относительно лямбда-функций в С++

Я давно работаю с C++, но только недавно начал играться с лямбда-выражениями. У меня есть следующий пример, который доставляет мне некоторые проблемы с его выяснением (почему он ведет себя так). Имейте в виду, что это всего лишь пример фрагмента.

double TwoParams::shiftedSquaredSum(double izero, double particlePotential, double shift)
{
    double sum=0;
    bool ok = true;
    int count = 0;
    double temp;

    //the term with index K in the RMS total sum  <------------- MY LAMBDA 
    auto rms = [](double exp, double th) {
        return std::pow(exp - th, 2.0);
    };

    for (int i = 0; i < Lu_163_Exp.dim1 && ok; ++i)
    {
        temp = rms(Lu_163_Exp.spin1Exp[i], band1EnergyShifted(Lu_163_Exp.spin1Exp[i], izero, particlePotential, shift));
        if (isnan(temp))
        {
            ok = 0;
            break;
        }
        if (!isnan(temp))
        {
            count++;
            sum += temp;
        }
    }
return sum;

Термины Lu_163_Exp.spin1Exp[i] - это некоторые постоянные двойные векторы, расположенные в другом классе, к которым я хочу получить доступ из нескольких источников .cpp, а band1EnergyShifted() - это метод, объявленный в классе TwoParams. Этот метод также относится к двойному типу.

Теперь моя проблема заключается в следующем: если лямбда rms имеет параметры exp и th типа double, компиляция прошла успешно, но если она у меня есть

 auto rms = [](auto exp, auto th) {    // <--------------- I initially wanted to set them with auto type
        return std::pow(exp - th, 2.0);
    };

компиляция дает ошибки:

twoParamsEnergies.cpp: In member function ‘double TwoParams::shiftedSquaredSum(double, double, double)’:
twoParamsEnergies.cpp:62:24: error: parameter declared ‘auto’
     auto rms = [](auto exp, auto th) {
                        ^
twoParamsEnergies.cpp:62:34: error: parameter declared ‘auto’
     auto rms = [](auto exp, auto th) {
                                  ^
twoParamsEnergies.cpp: In lambda function:
twoParamsEnergies.cpp:63:31: error: ‘th’ was not declared in this scope
         return std::pow(exp - th, 2.0);
                               ^
twoParamsEnergies.cpp: In member function ‘double TwoParams::shiftedSquaredSum(double, double, double)’:
twoParamsEnergies.cpp:68:119: error: no match for call to ‘(TwoParams::shiftedSquaredSum(double, double, double)::__lambda0) (double&, double)’
         temp = rms(Lu_163_Exp.spin1Exp[i], band1EnergyShifted(Lu_163_Exp.spin1Exp[i], izero, particlePotential, shift));

Из того, что я понял до сих пор, компилятор должен сам определить тип exp и th, если параметры имеют автоматический тип. Я что-то упускаю?

Заранее спасибо!


person Robert Poenaru    schedule 26.10.2019    source источник
comment
Вы компилируете с С++ 14, а не с 11?   -  person Fureeish    schedule 26.10.2019
comment
Общие лямбды (лямбды с auto аргументами) были добавлены в C++14. Какой компилятор вы используете, какую его версию и какие флаги вы указываете при сборке?   -  person Some programmer dude    schedule 26.10.2019
comment
ОК... Думаю, моя проблема связана с версией C++, которую я использую для компиляции. Я использовал С++ 11 в качестве флага. Я не понимал, что должен также обновить свой Makefile...   -  person Robert Poenaru    schedule 26.10.2019