2012-05-12 15 views
0

私はここで何かひどく間違っているようです。手伝って頂けますか?目的は、複雑なベクトルにinner_productを使用することです。inner_productとcomplex vectors

#include<iostream> 
#include<vector> 
#include <numeric> 
#include <complex> 


using namespace std; 



template<class T> 
complex<T> complex_prod(complex<T> a, complex<T> b) 
{ 
return conj<T>(a)*b; 
} 

template<class T> 
complex<T> add_c(complex<T> a, complex<T> b) 
{ 
    return a+b; 
} 

int main() 
{ 
    complex<double> c1(1.,3.); 
    complex<double> c2(2.,4.); 

    vector<complex<double> > C1(3,c1); 
    vector<complex<double> > C2(3,c2); 

cout<<inner_product(C1.begin(),C2.end(),C2.begin(),0.,add_c<double>,complex_prod<double>) <<endl; 

return 0; 
} 

なぜ変換に問題があるのか​​わかりません。すべてが定義されているようですが、繰り返しは問題にならないはずです。

答えて

3

問題はinner_productが初期値の種類を知っておく必要があることですので、あなたはそれを渡す必要がstd::complex代わり0.の:

inner_product(C1.begin(),C2.end(),C2.begin(),std::complex<double>(0.,0.),add_c<double>,complex_prod<double>); 

または単に、

inner_product(C1.begin(),C2.end(),C2.begin(),std::complex<double>(),add_c<double>,complex_prod<double>); 

が、 std::complex<double>は、単一の数値型から暗黙的に構成できます。

std::complex<double> c = 2.*4.*300; 

inner_productテンプレートはそうvalueのためのテンプレートパラメータがある

template< 
    class InputIterator1, 
    class InputIteratorr2, 
    class T, 
    class BinaryOperation1, 
    class BinaryOperation2 
> T inner_product(InputIterator1 first1, InputIterator1 last1, 
        InputIterator2 first2, T value, 
        BinaryOperation1 op1, 
        BinaryOperation2 op2); 

のように見えます。したがって、コンパイラがstd::complex<double>を意味することがわかる方法はありません。0.doubleと解釈されます。

+0

ありがとうございました! なぜ変換されないのですか?追加:複合(0、0) –

+0

@pawel_winzig私は言う必要があります、わかりません!暗黙的な変換*はうまくいくはずです。私はあなたのエラーを再現しようとします。 – juanchopanza

+0

@JamesCuster私はそれを理解しました。 – juanchopanza