10

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++ 标准,在这种情况下我的问题是:为什么标准不允许这样做?

4

2 回答 2

15

这有效:

#include <complex>
#include <iostream>

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

因为 complex 由双精度数组成,所以它与双精度数相乘。看声明:

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

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

对于您想要工作的内容,它必须具有类似于以下定义的函数:

template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
    return lhs *= rhs;
}

这允许函数采用不同的类型,从而允许在调用operator*=.

于 2009-10-29T05:56:02.017 回答
2

std::complex<T>complex<T>的运算符被定义为将其他实例作为其参数。int从via adouble到 a的路径complex<double>稍微有点太扭曲/令人费解,以至于 C++ 语言无法按照标准遵循它(并且由于自由转换和内聚已经产生了巨大的复杂性,因此很难批评标准的方面)。考虑到程序员complex<double>将_他们真正想要的!-)intintdouble

于 2009-10-29T06:03:11.427 回答