考虑这段代码:
#include <iostream>
#include <complex>
int main()
{
std::complex<double> z1 = 5;
std::cout << z1 - 1 << "\n"; // must change to z1 - 1.0 to compile
std::complex<int> z2 = 5;
std::cout << z2 - 1.0 << "\n"; // must change to z2 - 1 to compile
}
这会产生编译错误,因为找不到表达式operator-
或z1 - 1
中的类型z2 - 1.0
。另一方面,更改这些表达式以使基本类型匹配可以正常工作。
天真地,对于z1 - 1
,我希望将int
1提升为double
,并期望z2
,基本类型为int
,在z2 - 1.0
中将其提升为complex<double>
。发生了什么事?
答案 0 :(得分:6)
您尝试调用的operator-
是一个带有单个模板参数的函数模板。
template< class T >
complex<T> operator-( const complex<T>& lhs, const T& rhs);
两个函数参数中的模板参数都没有出现在非推导的上下文中,因此单独对两个参数执行模板参数推导,这导致推导出T
lhs
作为double
,rhs
的推导为int
。
由于推断类型之间的这种不匹配,模板参数推断失败,并且您的代码无法编译。
答案 1 :(得分:0)
如果A是整数且B是浮点数,编译器不会自动将类型从A转换为B到C.您希望编译器从int
转换为&gt; double
- &gt; complex<double>
,但它不会那样做。
对于第二个示例,您需要将complex<int>
提升为complex<double>
,这不会由complex
类模板自动处理。