2017-06-02 100 views
0

我正在編寫一個模板音頻類(與typename T)音頻操作與二進制數據是int16_tint8_t。 Lambda函數對我來說是非常新的,所以我不知道這個函數用於計算均方根(RMS)有什麼問題。下面是代碼:C++ Lambda函數轉換錯誤

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是一個短整型此功能。

感謝

+0

您返回的是lambda而不是調用lambda的結果。你需要附加'()'。 –

+0

這個lambda的目的是什麼?你的意思是將它返回到呼叫站點,還是你想調用它?如果你想調用它並返回一個值,那麼這裏就不需要lambda了。只需將其刪除,該功能將「正常工作」。 – NathanOliver

+0

在你的代碼中,你正在編寫一個返回T值的函數,但是使用一個lambda來計算它。爲什麼?爲什麼需要使用lambda?你可以編寫一個標準的模板函數來使用它來完成工作。 – bracco23

回答

3

固定寬度的整數只是typedef S,他們不是在自己的一個類型。在你的情況下,short int正好是1個字節寬。

錯誤是相當清楚的:

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

它可以將拉姆達不能轉換爲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; 
}(); 
+0

感謝您的評論!我這樣做的唯一原因是證明我可以理解大學講師的lambda函數,否則我會以簡單的方式完成它。 :D –

+2

@MattYoung在不合適的地方使用拉姆達可以向你的講師證明你沒有理解** lambdas,恐怕。 – Walter

+0

@Walter沒有什麼可以理解的。它只是一個內聯函數。在這種情況下沒有實際用法,因爲它是一個非常簡單的計算(lambda從來不被用作過濾器/比較器),但我們被迫使用了一個。 –