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

时间:2015-06-05 00:02:08

标签: 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
}

这会产生编译错误,因为找不到表达式operator-z1 - 1中的类型z2 - 1.0。另一方面,更改这些表达式以使基本类型匹配可以正常工作。

天真地,对于z1 - 1,我希望将int 1提升为double,并期望z2,基本类型为int,在z2 - 1.0中将其提升为complex<double>。发生了什么事?

2 个答案:

答案 0 :(得分:6)

您尝试调用的operator-是一个带有单个模板参数的函数模板。

template< class T >
complex<T> operator-( const complex<T>& lhs, const T& rhs);

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

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

答案 1 :(得分:0)

如果A是整数且B是浮点数,编译器不会自动将类型从A转换为B到C.您希望编译器从int转换为&gt; double - &gt; complex<double>,但它不会那样做。

对于第二个示例,您需要将complex<int>提升为complex<double>,这不会由complex类模板自动处理。