2016-06-14 17 views
0

Ich erhalte die Fehlermeldung:Fehler: keine passende Funktion für Aufruf von 'conj (CArray &)'

iterDelayEst.cpp:32:21: error: no matching function for call to ‘conj(CArray&)’ 
auto nf1= ((x*conj(x)) * (x2*conj(x2))) 
        ^
iterDelayEst.cpp:32:21: note: candidates are: 
In file included from myfft.cpp:1:0: 
/usr/include/c++/4.9/complex:669:5: note: template<class _Tp> std::complex<_Tp> std::conj(const std::complex<_Tp>&) 
    conj(const complex<_Tp>& __z) 
    ^
/usr/include/c++/4.9/complex:669:5: note: template argument deduction/substitution failed: 
In file included from myfft.cpp:16:0: 
iterDelayEst.cpp:32:21: note: ‘CArray {aka std::valarray<std::complex<double> >}’ is not derived from ‘const std::complex<_Tp>’ 
auto nf1= ((x*conj(x)) * (x2*conj(x2))) 
        ^
In file included from myfft.cpp:1:0: 
/usr/include/c++/4.9/complex:1924:5: note: template<class _Tp> typename __gnu_cxx::__promote<_Tp>::__type std::conj(_Tp) 
    conj(_Tp __x) 
    ^
/usr/include/c++/4.9/complex:1924:5: note: template argument deduction/substitution failed: 
/usr/include/c++/4.9/complex: In substitution of ‘template<class _Tp> typename __gnu_cxx::__promote<_Tp>::__type std::conj(_Tp) [with _Tp = std::valarray<std::complex<double> >]’: 
iterDelayEst.cpp:32:21: required from here 
/usr/include/c++/4.9/complex:1924:5: error: no type named ‘__type’ in ‘struct __gnu_cxx::__promote<std::valarray<std::complex<double> >, false>’ 
In file included from myfft.cpp:16:0: 
iterDelayEst.cpp:32:37: error: no matching function for call to ‘conj(CArray&)’ 
auto nf1= ((x*conj(x)) * (x2*conj(x2))) 
            ^

beim Versuch, die folgende Funktion in meinem Programm auszuführen:

//iterDelayEst.cpp 
    #include <complex> 
    #include "binFreq.cpp" 
    #include <valarray> 

    typedef std::complex<double> Complex; 
    typedef std::valarray<Complex> CArray; 

    double iterDelayEst(int n,CArray& x, CArray& x2) 
    { 


      /****************************constants*********************/ 
    //exit if uncertainty below threshold 
    double thr_samples = 1e-7; 

    //exit after fixed number of iterations 
    double nIter = 25; 
    fft(x); 
    fft(x2); 
    //frequency domain representation of signals 
    std::vector<double> tau; 

    auto f = binFreq(n); 

    std::vector<double> e; 


    int j; 
    for (j = 0 ; j < n ; j++){ 

    auto nf1= ((x*std::conj(x) * (x2*std::conj(x2)); 
    nf1 +=nf1; 
    auto nf2 =std::sqrt(nf1); 
    auto nf =nf2/(double)n; 

    } 

    } 

I denke, es kann mit conj Argumenttyp verwandt sein, aber ich kann herausfinden, wie man es löst. Danke für die Hilfe und fühle mich frei, mich zu bitten, alles zu klären.

Antwort

0

std::valarray überlädt eine Teilmenge der mathematischen Operationen, so dass sie unabhängig voneinander auf jedes Element angewendet werden. std::conj ist nicht einer von ihnen. Für diejenigen, die für std::valarray nicht überlastet werden, kann man die std::valarray<T>::apply(F) Member-Funktion verwenden:

auto op = [](CArray::value_type v) { return std::conj(v); }; 

auto nf1 = ((x * x.apply(op)) * (x2 * x2.apply(op))); 
//     ~~~~~~~~^    ~~~~~~~~^ 
+1

Dank Piotr, scheint es zu funktionieren !!!! – Serge