在C中添加双精度数和复数

前端之家收集整理的这篇文章主要介绍了在C中添加双精度数和复数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑一下这段代码
#include <iostream>
#include <complex>

int main()
{
  std::complex<double> z1 = 5;
  std::cout << z1 - 1 << "\n";  // must change to z1 - 1.0 to compile

  std::complex<int> z2 = 5;
  std::cout << z2 - 1.0 << "\n";  // must change to z2 - 1 to compile
}

这会产生编译错误,因为在表达式z1 – 1或z2 – 1.0中找不到类型的运算符.另一方面,更改这些表达式以使基本类型匹配工作正常.

天然地,对于z1 – 1,我希望int 1被提升为double,并且期望z2 – 1.0中基本类型为int的z2被提升为复数< double>.这是怎么回事?

解决方法

您尝试调用operator-是具有单个类型模板参数的函数模板.
template< class T >
complex<T> operator-( const complex<T>& lhs,const T& rhs);

两个函数参数中的模板参数都没有出现在非推导的上下文中,因此单独对两个参数执行模板参数推导,这导致lhs的T被推导为double,而rhs的T推导为int .

由于推断类型之间的这种不匹配,模板参数推断失败,并且您的代码无法编译.

猜你在找的C&C++相关文章