为什么类型铸造在这里不起作用?

beh*_*uri 0 c++ casting

以下代码具有类型转换错误

#define IMG_I (std::complex<double>(0, 1))
#define PI 3.1415926535
for (unsigned long int j = 0; j < 10; ++j)
  std::cout << exp(-IMG_I * PI * j);
Run Code Online (Sandbox Code Playgroud)

通过使用额外的括号或改变乘法的顺序,可以很容易地解决类型转换.但是我不清楚为什么首先出现类型转换问题以及为什么c ++无法处理上述代码.

有人可以帮我解释一下吗?

Jam*_*lis 8

这个operator*重载std::complex是一个函数模板,其声明如下所示:

template<typename T> 
complex<T> operator*(const complex<T>& lhs, const T& val); 
Run Code Online (Sandbox Code Playgroud)

Tcomplex<T>lhs参数必须为相同Tval,以论据模板实参推演工作.

您正尝试使用std::complex<double>(类型-IMG_I * PI)和unsigned long(类型j)来调用它. double并且unsigned long类型不同,因此模板参数推断失败.

-IMG_I * (PI * j)因为类型PI * j是有效的double,所以对于什么T是没有歧义.同样,-IMG_I * PI * static_cast<double>(j)出于同样的原因也起作用.