2012-05-12 56 views
0

看来我在这里做了一些非常错误的事情。你可以帮我吗?目的是将inner_product用于复数载体。inner_product and 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模板看起来像

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

所以对于value模板参数。所以编译器在这里没有办法知道你的意思是std::complex<double>,它只是将0.解释为double

+0

谢谢! 为什么0.未转换?增加:复杂(0,0。) –

+0

@pawel_winzig我必须说,我不确定!隐式转换*应该有效。我会尽力重现你的错误。 – juanchopanza

+0

@JamesCuster我明白了。 – juanchopanza