考虑一下这段代码:
#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
or z2 - 1.0
。另一方面,更改这些表达式以使基本类型匹配可以正常工作。
天真地,为了z1 - 1
我希望int
1 晋升为double
,并期望z2
,带基本类型int
, in z2 - 1.0
晋升为complex<double>
。这是怎么回事?
The operator- http://en.cppreference.com/w/cpp/numeric/complex/operator_arith3您尝试调用的是具有单个类型模板参数的函数模板。
template< class T >
complex<T> operator-( const complex<T>& lhs, const T& rhs);
两个函数参数中的模板参数都不会出现在非推导上下文中,因此分别对两个参数执行模板参数推导,这会导致T
for lhs
被推导为double
,而对于rhs
推导为int
.
由于推导类型之间的不匹配,模板参数推导失败,并且您的代码无法编译。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)