abs的返回类型是复杂的

Return type of abs is complex?

本文关键字:复杂 返回类型 abs      更新时间:2023-10-16

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

在本例中,我希望返回一个浮点数

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

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

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

我相信你打算使用的函数是std::abs<float>,这将导致这样的签名:

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

错误信息显示表达式的类型

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

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

您正在尝试应用函数

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

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

错误:无法在赋值中将std::complex转换为float __result = __unary_op ( __first);

任何数(实数或复数)的绝对值定义为向量从原点到它在阿甘平面上的点的长度。