2016-06-14 49 views
0

我收到錯誤信息不匹配功能:錯誤:調用「連詞(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))) 
            ^

,而試圖在我的程序運行下面的功能:

//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; 

    } 

    } 

我猜測它可能與conj參數類型有關,但我可以弄清楚如何解決它。 感謝您的幫助,並隨時要求我澄清任何事情。

回答

0

std::valarray重載數學運算的一個子集,以便它們獨立地應用於每個元素。 std::conj不是其中之一。對於那些沒有重載std::valarray,可以使用std::valarray<T>::apply(F)成員函數:

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

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

謝謝彼得,似乎工作!!!! – Serge