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++ 标准,在这种情况下我的问题是:为什么标准不允许这样做?
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++ 标准,在这种情况下我的问题是:为什么标准不允许这样做?
这有效:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> z(0,2);
double n = 3.0; // Note, double
std::cout << z * n << std::endl;
}
因为 complex 由双精度数组成,所以它与双精度数相乘。看声明:
template <typename T>
inline complex<T> operator*(const complex<T>&, const T&);
(以下是感谢dribeas)编译器不允许在模板推导期间进行隐式类型转换,因此通过传递一个complex
with T being double
,然后另一个Tbeing,int
当试图匹配将T as的函数时,double
会导致第二个参数不匹配,反之亦然。
对于您想要工作的内容,它必须具有类似于以下定义的函数:
template <typename T, typename U>
inline std::complex<T> operator*(std::complex<T> lhs, const U& rhs)
{
return lhs *= rhs;
}
这允许函数采用不同的类型,从而允许在调用operator*=
.
std::complex<T>
complex<T>
的运算符被定义为将其他实例作为其参数。int
从via adouble
到 a的路径complex<double>
稍微有点太扭曲/令人费解,以至于 C++ 语言无法按照标准遵循它(并且由于自由转换和内聚已经产生了巨大的复杂性,因此很难批评标准的这方面)。考虑到程序员complex<double>
将_他们真正想要的!-)int
int
double