2016-06-14 5 views
0

Je reçois le message d'erreur:erreur: aucune fonction de mise en correspondance pour l'appel à '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))) 
            ^

tout en essayant d'exécuter la fonction suivante dans mon programme:

//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 deviner il peut être lié à conj type d'argument, mais je peux comprendre comment le résoudre. Merci pour l'aide et n'hésitez pas à me demander de clarifier quoi que ce soit.

Répondre

0

std::valarray surcharge un sous-ensemble d'opérations mathématiques afin qu'elles soient appliquées à chaque élément indépendamment. std::conj n'en fait pas partie. Pour ceux qui ne sont pas en surcharge pour std::valarray, on peut utiliser la fonction de membre 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

Merci Piotr, il semble fonctionner !!!! – Serge