返回的abs类型很复杂?

时间:2014-07-25 09:33:02

标签: c++ complex-numbers

std :: abs是否返回复数值?也就是说,实数值表示为具有零虚部的复数。我收到此错误

g++ -march=native "utilities.cpp" -fpic -g -Wall -c -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/utilities.o"

  

In file included from /usr/include/c++/4.8/algorithm:62:0, from /home/torbjorr/deployed/herbs/memory/memory.h:14, from /home/torbjorr/deployed/vector/matrixstorage.h:10, from frame_in.h:9, from utilities.cpp:6: /usr/include/c++/4.8/bits/stl_algo.h: In instantiation of '_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = std::complex<float>*; _OIter = float*; _UnaryOperation = std::complex<float> (*)(const std::complex<std::complex<float> >&)]': utilities.cpp:89:34: required from here /usr/include/c++/4.8/bits/stl_algo.h:4926:12: error: cannot convert 'std::complex<float>' to 'float' in assignment *__result = __unary_op(*__first);

当这样调用时:

std::transform(spectrum.begin(),spectrum.end(),temp.begin()
    ,std::abs<std::complex<float> >);

来自cppreference.com:

template< class T > T abs( const complex<T>& z );

所以在这种情况下,我希望有一个回归。

3 个答案:

答案 0 :(得分:2)

std::transform(spectrum.begin(),spectrum.end(),temp.begin()
    ,std::abs<std::complex<float> >);

请注意,您正在尝试使用std::abs<std::complex<float>>。在这种情况下,模板参数Tstd::complex<float>。如果您在T的签名中替换std::abs,则会得到以下结果:

std::complex<float> abs( const std::complex<std::complex<float>>& z );

我相信您打算使用的功能是std::abs<float>,这会产生如下签名:

float abs(const std::complex<float>& z);

答案 1 :(得分:0)

由于错误消息显示表达式的类型

spectrum.begin()spectrum.end()std::complex<float>*

虽然表达式temp.begin()的类型为float*

您正在尝试应用功能

template< class T > T abs( const complex<T>& z );

到float类型的对象,但没有从类型complex<float到类型float.的隐式转换。

错误:无法转换&#st; :: complex&#39;到&#39;漂浮&#39;在任务中      __ result = __unary_op( __ first);

答案 2 :(得分:-2)

任何数字(实数或复数)的绝对值都定义为从原点到Argand平面上的点的矢量长度。

这是一个实数。