C ++程序
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
int n = 3;
std::cout << z * n << std::endl;
}
产生错误:'z * n'中的'operator *'不匹配。为什么?
我正在使用g ++ 4.4.1进行编译。也许编译器只是遵循C ++标准,在这种情况下我的问题是:为什么标准不允许这样做?
答案 0 :(得分:14)
这有效:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
因为复数由双打组成,所以它与双精度相乘。看一下宣言:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(以下是感谢dribeas)在模板推导期间,不允许编译器进行隐式类型转换,因此通过传递complex
T 为{{ 1}},然后另一个 T 为double
,当尝试匹配将 T 视为int
的函数时,会导致第二个参数错误匹配,反之亦然。
对于你想要工作的东西,它必须有一个类似于这个定义的函数:
double
允许函数采用不同的类型,这允许在调用template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
时完成强制转换。
答案 1 :(得分:2)
std::complex<T>
的运算符被定义为将其他complex<T>
个实例作为其参数。从int
到double
到complex<double>
的路线对于C ++语言来说,根据标准(以及已经出现的巨大复杂情况)略微过于扭曲/复杂化自由转换和cohercions很难批评标准的方面。我想complex<double>
允许未被发现的int
作为其操作符的操作数的超级特殊情况不被认为是频繁和重要的,足以保证为极其个别的情况指定模板特化,考虑到它是多么简单易行是程序员将int
投射到double
的时候,他们实际上想要! - )