2016-06-14 8 views
0

私は、エラーメッセージを取得していますに該当する機能:エラー:への呼び出し '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))) 
            ^

私のプログラムでは、以下の機能を実行しようとしているとき:

//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それはconj引数タイプに関連するかもしれないと推測しますが、私はそれを解決する方法を見つけることができます。 助けてくれてありがとう、何かを明確にするように私に依頼してください。

答えて

0

std::valarrayは、数学演算のサブセットをオーバーロードして、各要素に独立して適用します。 std::conjはその1つではありません。 std::valarrayオーバーロードされていないものについては、1が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

関連する問題