Я давно работаю с 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
, если параметры имеют автоматический тип. Я что-то упускаю?
Заранее спасибо!
auto
аргументами) были добавлены в C++14. Какой компилятор вы используете, какую его версию и какие флаги вы указываете при сборке? - person Some programmer dude   schedule 26.10.2019