以下代码无法使用-std=c++0x
开关使用g ++版本4.5.0进行编译。我收到以下错误消息:
error: no match for 'operator+' in 'std::pow [with _Tp = float, _Up = int, typename __gnu_cxx::__promote_2<_Tp, _Up>::__type = double](((const std::complex<float>&)((const std::complex<float>*)(& x))), ((const int&)((const int*)(&2)))) + y'
我认为这与提到here的可分配要求有关。我应该为复杂定义我自己的复制赋值运算符吗?如果是这样,怎么样?
#include <complex>
using namespace std;
int main(int argc, char *argv[]) {
complex<float> x,y;
x = pow(x,2); // ok
x = x + y; // ok
x = pow(x,2) + y; // error
return 0;
}
答案 0 :(得分:11)
[cmplx.over] / p3指定涉及pow
时complex
的其他重载:
功能模板pow应具有足够的额外过载 对于至少有一个类型为
complex<T>
的参数的调用,请确保:
如果任一参数的类型为
complex<long double>
或类型为long double
,则两个参数都会有效地转换为complex<long double>
。否则,如果任一参数具有类型
complex<double>
,double
或整数类型,则两个参数都被有效地转换为complex<double>
。- 醇>
否则,如果任一参数的类型为
complex<float>
或float
,则两个参数都有效地转换为complex<float>
。
2正在升级为双倍,pow(complex<float>, double)
会返回complex<double>
。