C ++ Lambda函数转换错误

时间:2017-06-02 11:23:35

标签: c++ function lambda typename

我正在编写模板化音频类(带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是一个短整数。

由于

1 个答案:

答案 0 :(得分:3)

固定宽度整数只是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的主体并将其作为函数的主体...这种技术(立即调用lambda)的唯一情况是当你需要初始化一些常量时从一个复杂的表达:

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