2017-06-02 16 views
0

int16_tまたはint8_tのいずれかのバイナリデータでオーディオ操作用のテンプレート付きオーディオクラス(typename T)を作成しています。ラムダ関数は私にとって非常に新しいものなので、二乗平均平方根(RMS)の計算に使用されるこの関数の何が間違っているのか分かりません。私はそれはTがshort int型であると言う理由があると思いC++ラムダ関数変換エラー

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 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()); 
     }; 
} 

エラーがスローされます。ここでは、コードです。

おかげ

+0

ラムダを呼び出した結果ではなく、ラムダが返されます。 '()'を追加する必要があります。 –

+0

このラムダの目的は何ですか?コールサイトに戻すことを意味するのか、それとも呼び出すのですか?それを呼び出して値を返す場合は、ここにラムダは必要ありません。ただそれを削除すると、機能は "ちょうど"動作します。 – NathanOliver

+0

あなたのコードでは、T値を返すが、それを計算するラムダを使う関数を書いています。どうして?なぜラムダを使用する必要がありますか?標準的なテンプレート関数を書くだけで作業を行うことができます。 – bracco23

答えて

3

固定幅の整数は、彼らが自分自身でタイプじゃない、ただtypedef秒です。あなたの場合、short intは正確に1バイト幅です。

誤差はかなり明確です:

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

それはshort intにラムダを変換することはできません。

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 

しかし、なぜあなたはこのために、ラムダを使用している:ラムダは、あなたがそれの結果を取得したい場合、あなたはそれを呼び出す必要があり、単に関数オブジェクトであることを覚えていますか?あなたがラムダの本体を取ってそれを関数の本体として置くことができるので、実際には意味をなさない...このテクニック(ラムダを直ちに呼び出す)がいくつかの定数を初期化する必要がある場合

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

コメントありがとう!私がこれをやっている唯一の理由は、大学の講師にラムダ機能を理解できることを実証することです。 :D –

+2

@MattYoungラムダを適切に使用しないと、あなたの講師にあなたが**ラムダを理解できなかったことが示されます、私は恐れます。 – Walter

+0

@Walter理解することは何もありません。それはすべてインライン関数です。これは非常に簡単な計算であるため(ラムダは決してフィルター/比較器として使用されることはありません)、実際に使用することはできませんが、強制的に使用します。 –