以下代码具有类型转换错误
#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 ++无法处理上述代码.
有人可以帮我解释一下吗?
这个operator*重载std::complex是一个函数模板,其声明如下所示:
template<typename T>
complex<T> operator*(const complex<T>& lhs, const T& val);
Run Code Online (Sandbox Code Playgroud)
将T在complex<T>该lhs参数必须为相同T的val,以论据模板实参推演工作.
您正尝试使用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)出于同样的原因也起作用.
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |