【发布时间】:2020-03-16 19:08:55
【问题描述】:
我正在尝试重载 * 运算符以使用模板计算 vector<double> 和 vector<complex<double>> 向量的标量积,并且在尝试了我所知道的一切之后我得到了这个:
#include <iostream>
#include <complex>
#include <vector>
using namespace std;
template<typename T> T operator* (const vector<T> &a, const vector<T> &b) {
T retvar; complex<double> c = 0;
for (int i = 0; i < b.size(); i++) c += conj(a[i])*b[i];
if (is_same<T, double>::value) retvar = c.real();
else retvar = c; // (*) the error is generated by this line
return retvar;
}
int main() {
vector<double> a, b;
a.push_back(5); b.push_back(3);
cout << a*b << endl;
return 0;
}
我要做的是:我计算复数的标量积,然后将其返回包含在模板给出的类型的变量中,以避免任何奇怪的转换。但是,g++ 在 (*) 行抛出以下错误:
error: assigning to 'double' from incompatible type 'complex<double>'
老实说,我已经没有想法了,有什么好的方法可以摆脱这个而不会使运算符重载两次?
【问题讨论】:
-
我相信使用
auto和/或尾随返回类型是您应该调查的内容。 -
双精度和复数的标量积不一样吗?我的意思是除了一个是另一个复杂的两倍之外?
-
不要重载你不拥有的类型的操作。如果您愿意,请将向量包装在您自己的类中并为它们提供重载。
-
同意@NathanOliver。使用显式命名的函数 -
scalar_product。 -
你用的是c++17吗?然后使用
if constexpr (is_same...)。
标签: c++ templates vector double complex-numbers