gpt4 book ai didi

C++ Lambda 函数转换错误

转载 作者:行者123 更新时间:2023-11-27 23:53:35 26 4
gpt4 key购买 nike

我正在编写一个模板化音频类(使用 typename T),用于使用 int16_tint8_t 的二进制数据进行音频操作。 Lambda 函数对我来说很新,所以我不知道这个用于计算均方根 (RMS) 的函数有什么问题。这是代码:

T calculate_RMS() {
return [&] () {
std::vector<T> squares;

for(int i = 0; i < this->data_vector.size(); ++i) {
squares.push_back(std::pow(this->data_vector[i], 2));
}
return std::sqrt(std::accumulate(squares.begin(), squares.end(), 0) / squares.size());
};
}

抛出的错误是:

audio.h: In instantiation of ‘T YNGMAT005::Audio<T>::calculate_RMS() [with T 
= short int]’:
audiodriver.cpp:119:66: required from here
audio.h:178:5: error: cannot convert ‘YNGMAT005::Audio<T>::calculate_RMS()
[with T = short int]::__lambda0’ to ‘short int’ in return
};
^
audio.h: In instantiation of ‘T YNGMAT005::Audio<T>::calculate_RMS() [with T = signed char]’:
audiodriver.cpp:122:65: required from here
audio.h:178:5: error: cannot convert ‘YNGMAT005::Audio<T>::calculate_RMS()
[with T = signed char]::__lambda0’ to ‘signed char’ in return
make: *** [audiodriver.o] Error 1

我正在使用 int8_t 测试这个函数,所以我认为这就是为什么它说 T 是一个 short int。

谢谢

最佳答案

固定宽度的整数只是 typedef,它们本身不是类型。在您的例子中,short int 正好是 1 个字节宽。

错误很明显:

error: cannot convert ‘YNGMAT005::Audio<T>::calculate_RMS() 
[with T = short int]::__lambda0’ to ‘short int’ in return

它无法将 lambda 转换为 short int。记住 lambda 只是一个函数对象,如果你想得到它的结果,你需要调用它:

    return [&] () {
std::vector<T> squares;

for(int i = 0; i < this->data_vector.size(); ++i) {
squares.push_back(std::pow(this->data_vector[i], 2));
}
return std::sqrt(std::accumulate(squares.begin(), squares.end(), 0) / squares.size());
}();
^^^^
call the lambda

但是为什么要为此使用 lambda?它真的没有意义,因为你可以只获取 lambda 的主体并将其作为函数的主体......这种技术(立即调用 lambda)的唯一情况是当你需要初始化一些常量时来自一个复杂的表达式:

constexpr auto value = []() {
std::array<int, 10> result;
for (auto i = 0u; i < 10; ++i)
result[i] = i * 5;
return result;
}();

关于C++ Lambda 函数转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44327726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com