C lambda函数转换误差



我正在编写一个模板的音频类(带有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很短。

谢谢

固定宽度整数只是typedef s,它们本身不是一种类型。在您的情况下, 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的主体置于功能的主体...来自复杂的表达:

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

最新更新