【发布时间】:2019-04-03 17:50:39
【问题描述】:
假设T operator*(const T &t, double d) 已定义,我想将std::complex<T> 与double 进行多重播放。由于我需要为 3 种不同类型 T 执行此操作,因此我尝试为操作员编写模板函数。这是T=float 的示例。
#include <iostream>
#include <complex>
template <typename T>
std::complex<T> operator*(const std::complex<T> &cd, double d) {
return std::complex<T>(cd.real() * d, cd.imag());
}
int main() {
std::complex<float> cf(1.0, 1.0);
std::complex<double> cd(1.0, 1.0);
double d = 2.0;
std::cout << cf * d << std::endl;
std::cout << cd * d << std::endl;
}
这会导致编译器错误
error: ambiguous overload for ‘operator*’ (operand types are ‘std::complex<double>’ and ‘double’)
原因很清楚,因为对于T=double,我的重载与<complex> 中的实现发生冲突。首先将右侧转换为T(即上例中的cf * float(d))不是一种选择,因为这会给我的一些数据类型带来很大的开销。
有什么方法可以告诉编译器它应该忽略我对T=double 的重载?
【问题讨论】:
标签: c++ templates operator-overloading std operator-keyword