我继承了一些C ++代码,需要平均一些复数。给定一个集合,它将添加那些将条件传递给累加器的值,然后除以所添加值的数量。
使用gcc(当前为gcc 8),template argument deduction/substitution failed
如果我使用独立版本,我会得到,operator/
但是它可以正常使用std::complex::operator/=
。对于后续维护者来说,这样的细微差别似乎很脆弱。
那么获得复数平均值的正确方法是什么?
语言仅部分支持复数按整数类型的划分是否合理?
std::complex<double> A[32] = { /* initialization left to the reader */ };
int count = 0;
std::complex<double> sum;
for (auto i = 0; i < 32; ++i) {
if ( i % 2 ) { // arbitrary condition, not important
sum += A[i];
++count;
}
}
auto avg = sum / count; // this is ambiguous
sum /= count; // this is not
(代表错误,出于好奇)
main.cpp: In function ‘int main()’:
main.cpp:16:16: error: no match for ‘operator/’ (operand types are ‘std::complex<double>’ and ‘int’)
auto avg = sum / count; // this is ambiguous
~~~~^~~~~~~
In file included from main.cpp:2:0:
/usr/include/c++/7/complex:434:5: note: candidate: template<class _Tp> std::complex<_Tp> std::operator/(const _Tp&, const std::complex<_Tp>&)
operator/(const _Tp& __x, const complex<_Tp>& __y)
^~~~~~~~
/usr/include/c++/7/complex:434:5: note: template argument deduction/substitution failed:
main.cpp:16:18: note: mismatched types ‘const std::complex<_Tp>’ and ‘int’
auto avg = sum / count; // this is ambiguous
^~~~~
In file included from main.cpp:2:0:
/usr/include/c++/7/complex:425:5: note: candidate: template<class _Tp> std::complex<_Tp> std::operator/(const std::complex<_Tp>&, const _Tp&)
operator/(const complex<_Tp>& __x, const _Tp& __y)
^~~~~~~~
/usr/include/c++/7/complex:425:5: note: template argument deduction/substitution failed:
main.cpp:16:18: note: deduced conflicting types for parameter ‘const _Tp’ (‘double’ and ‘int’)
auto avg = sum / count; // this is ambiguous
^~~~~
In file included from main.cpp:2:0:
/usr/include/c++/7/complex:416:5: note: candidate: template<class _Tp> std::complex<_Tp> std::operator/(const std::complex<_Tp>&, const std::complex<_Tp>&)
operator/(const complex<_Tp>& __x, const complex<_Tp>& __y)
^~~~~~~~
/usr/include/c++/7/complex:416:5: note: template argument deduction/substitution failed:
main.cpp:16:18: note: mismatched types ‘const std::complex<_Tp>’ and ‘int’
auto avg = sum / count; // this is ambiguous
^~~~~
不知道最适合进行除法的方法是什么,但是如果仔细检查所有参数operator/
并operator/=
采用,则会注意到:
operator/
接受std::complex<T>
或T
。
double
,则该复合体只能采用double
或的另一个值complex<double>
。clang
直接给出了invalid operands to binary expression ('std::complex<double>' and 'int')
错误operator/=
发生在std::complex<T>
或T
,同时还具有专业化float
,double
和long double
。
operator/=
将有一个变化是隐式转换为float
,double
或者long double
,它int
可以做。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句