2017-06-02 3 views
0

Ich schreibe eine Audio-Klasse mit Audio-Bearbeitung (mit typename T) mit binären Daten, die entweder int16_t oder int8_t ist. Lambda-Funktionen sind für mich sehr neu, daher weiß ich nicht, was mit dieser Funktion falsch ist, die zur Berechnung des quadratischen Mittelwerts (RMS) verwendet wird. Hier ist der Code:C++ Lambda-Funktion Konvertierungsfehler

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

Der Fehler ausgelöst wird, ist:

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 

Ich testete diese Funktion verwenden int8_t so denke ich, das ist, warum es heißt T ein short int ist.

Dank

+0

Sie geben das Lambda und nicht das Ergebnis des Aufrufs des Lambda zurück. Sie müssen '()' anhängen. –

+0

Was ist der Zweck dieses Lambda? Soll das an die Aufrufseite zurückgegeben werden oder möchten Sie sie aufrufen? Wenn Sie es aufrufen und einen Wert zurückgeben wollen, brauchen Sie hier kein Lambda. Einfach entfernen und die Funktion wird "einfach funktionieren". – NathanOliver

+0

In Ihrem Code schreiben Sie eine Funktion, die einen T-Wert zurückgibt, aber ein Lambda verwendet, das sie berechnet. Warum? Warum die Notwendigkeit, Lambda zu verwenden? Sie können einfach eine Standard-Template-Funktion schreiben, die Sie verwenden, um die Arbeit zu erledigen. – bracco23

Antwort

3

Die feste Breite ganze Zahlen sind nur typedef s, sie sind in sich selbst kein Typ. In Ihrem Fall ist short int genau 1 Byte breit.

Der Fehler ist ziemlich klar:

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

Es ist nicht das Lambda auf einen short int umwandeln kann. Denken Sie daran, dass ein Lambda ist nur ein Funktionsobjekt, wenn Sie das Ergebnis davon bekommen wollen, müssen Sie sie nennen:

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 

Aber warum verwenden Sie einen Lambda dafür? Es macht keinen Sinn, weil Sie einfach den Körper des Lambda nehmen und das als den Körper der Funktion stellen können ... Der einzige Fall, in dem diese Technik (ein Lambda sofort aufrufen) ist, wenn Sie eine Konstante initialisieren müssen aus einem komplizierten Ausdruck:

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

Danke für den Kommentar! Der einzige Grund, warum ich das tue, ist zu demonstrieren, dass ich Lambda-Funktionen für Universitätsdozenten verstehen kann, sonst hätte ich es auf die leichte Art gemacht. : D –

+2

@MattYoung Das Verwenden eines Lambdas, wo es nicht angebracht ist, demonstriert Ihrem Dozenten, dass Sie ** lambdas ** nicht verstanden haben, fürchte ich. – Walter

+0

@Walter Es gibt nichts zu verstehen. Alles was es ist, ist eine Inline-Funktion. In diesem Zusammenhang gibt es keinen praktischen Nutzen, da es eine sehr einfache Berechnung ist (das Lambda wird nie als Filter/Komparator verwendet), aber wir sind gezwungen, eins zu verwenden. –

Verwandte Themen