8

以下代码编译失败

#include <iostream>
#include <cmath>
#include <complex>

using namespace std;

int main(void)
{
    const double b=3;
    complex <double> i(0, 1), comp;

    comp = b*i;

    comp = 3*i;

    return 0;
}

有错误:'3 * i'中的'operator *'不匹配这里有什么问题,为什么我不能乘以立即常数?b*i 有效。

4

3 回答 3

7

在第一行:

comp = b*i;

编译器调用:

template<class T> complex<T> operator*(const T& val, const complex<T>& rhs);

例如:

template<> complex<double> operator*(const double& val, const complex<double>& rhs);

在第二种情况下,没有合适的模板int,所以实例化失败:

comp = 3.0 * i; // no operator*(int, complex<double>)
于 2010-04-15T18:18:21.957 回答
4

有关复杂运算符的概述,请参阅http://www.cplusplus.com/reference/std/complex/complex/operators/ 。

您会注意到 operator* 是一个模板,并将使用复杂类的模板参数来生成该代码。用于调用 operator* 的数字文字是 int 类型。采用comp = 3. * i;

于 2010-04-15T18:17:19.150 回答
4

std::complex课程有点愚蠢...定义这些以允许自动促销:

// Trick to allow type promotion below
template <typename T>
struct identity_t { typedef T type; };

/// Make working with std::complex<> nubmers suck less... allow promotion.
#define COMPLEX_OPS(OP)                                                 \
  template <typename _Tp>                                               \
  std::complex<_Tp>                                                     \
  operator OP(std::complex<_Tp> lhs, const typename identity_t<_Tp>::type & rhs) \
  {                                                                     \
    return lhs OP rhs;                                                  \
  }                                                                     \
  template <typename _Tp>                                               \
  std::complex<_Tp>                                                     \
  operator OP(const typename identity_t<_Tp>::type & lhs, const std::complex<_Tp> & rhs) \
  {                                                                     \
    return lhs OP rhs;                                                  \
  }
COMPLEX_OPS(+)
COMPLEX_OPS(-)
COMPLEX_OPS(*)
COMPLEX_OPS(/)
#undef COMPLEX_OPS
于 2018-07-27T09:42:54.360 回答