0

我收到错误消息:

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参数类型有关,但我可以弄清楚如何解决它。感谢您的帮助,并随时要求我澄清任何事情。

4

1 回答 1

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)));
//                 ~~~~~~~~^             ~~~~~~~~^
于 2016-06-14T07:53:37.897 回答