以下代码无法编译
#include <iostream>
#include <cmath>
#include <complex>
using namespace std;
int main(void)
{
const double b=3;
complex <double> i(0, 1), comp;
comp = b*i;
comp = 3*i;
return 0;
}
与 错误:'3 * i'中的'operator *'不匹配 这里有什么问题,为什么我不能乘以立即常数? b *我的作品。
答案 0 :(得分:6)
在第一行:
comp = b*i;
编译器调用:
template<class T> complex<T> operator*(const T& val, const complex<T>& rhs);
实例为:
template<> complex<double> operator*(const double& val, const complex<double>& rhs);
在第二种情况下,没有合适的模板int
,因此实例化失败:
comp = 3.0 * i; // no operator*(int, complex<double>)
答案 1 :(得分:4)
有关复杂运算符的概述,请参阅http://www.cplusplus.com/reference/std/complex/complex/operators/。
您会注意到operator *是一个模板,它将使用复杂类的template参数来生成该代码。用于调用operator *的数字文字是int类型。使用comp = 3. * i;
答案 2 :(得分:0)
std::complex
类有点愚蠢……将其定义为允许自动升级:
// Trick to allow type promotion below
template <typename T>
struct identity_t { typedef T type; };
/// Make working with std::complex<> nubmers suck less... allow promotion.
#define COMPLEX_OPS(OP) \
template <typename _Tp> \
std::complex<_Tp> \
operator OP(std::complex<_Tp> lhs, const typename identity_t<_Tp>::type & rhs) \
{ \
return lhs OP rhs; \
} \
template <typename _Tp> \
std::complex<_Tp> \
operator OP(const typename identity_t<_Tp>::type & lhs, const std::complex<_Tp> & rhs) \
{ \
return lhs OP rhs; \
}
COMPLEX_OPS(+)
COMPLEX_OPS(-)
COMPLEX_OPS(*)
COMPLEX_OPS(/)
#undef COMPLEX_OPS