为什么复杂的<double> * int没有在C ++中定义?</double>

时间:2009-10-29 05:52:15

标签: c++ complex-numbers

C ++程序

#include <complex>
#include <iostream>

int main()
{
  std::complex<double> z(0,2);
  int n = 3;
  std::cout << z * n << std::endl;
}

产生错误:'z * n'中的'operator *'不匹配。为什么?

我正在使用g ++ 4.4.1进行编译。也许编译器只是遵循C ++标准,在这种情况下我的问题是:为什么标准不允许这样做?

2 个答案:

答案 0 :(得分:14)

这有效:

#include <complex>
#include <iostream>

int main()
{
    std::complex<double> z(0,2);
    double n = 3.0; // Note, double
    std::cout << z * n << std::endl;
}

因为复数由双打组成,所以它与双精度相乘。看一下宣言:

template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);

(以下是感谢dribeas)在模板推导期间,不允许编译器进行隐式类型转换,因此通过传递complex T 为{{ 1}},然后另一个 T double,当尝试匹配将 T 视为int的函数时,会导致第二个参数错误匹配,反之亦然。

对于你想要工作的东西,它必须有一个类似于这个定义的函数:

double

允许函数采用不同的类型,这允许在调用template <typename T, typename U> inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs) { return lhs *= rhs; } 时完成强制转换。

答案 1 :(得分:2)

std::complex<T>的运算符被定义为将其他complex<T>个实例作为其参数。从intdoublecomplex<double>的路线对于C ++语言来说,根据标准(以及已经出现的巨大复杂情况)略微过于扭曲/复杂化自由转换和cohercions很难批评标准的方面。我想complex<double>允许未被发现的int作为其操作符的操作数的超级特殊情况不被认为是频繁和重要的,足以保证为极其个别的情况指定模板特化,考虑到它是多么简单易行是程序员将int投射到double的时候,他们实际上想要! - )

相关问题