我对模板化的运算符重载感到有些困惑。 说,我有一个班级
template <typename T1> base_matrix{
...
};
稍后,T1将是double
或complex<double>
。在类定义中,
我以两种方式重载乘法运算符。
版本#1
base_matrix<T1> operator*(base_matrix<T1>& ob) const{
...
}
这应该在我乘以两个矩阵时使用,例如: A * B
版本#2
template <typename T2>
friend base_matrix<T1> operator*(const base_matrix<T1>& ob, T2 f){
base_matrix<T1> res(ob); res *= (T1)f; return res;
}
template <typename T2>
friend base_matrix<T1> operator*(T2 f, const base_matrix<T1>& ob){
base_matrix<T1> res(ob); res *= (T1)f; return res;
}
当我将矩阵对象与数字相乘时(T2 = int,double,complex等),例如A * 2,3.0 * A
,这应该被使用。现在,当我尝试乘以两个矩阵时,会调用第二个重载版本,这有点意义正弦T2可以是任何数据类型,包括base_matrix<double>
,但这不是我想要的(版本#1 )。当然,这会导致错误,因为编译器尝试将此类型的参数转换为T1(double)。
由于某种原因,没有调用操作符重载的第一个版本,我很困惑为什么。
我正在寻求概念性的理解,所以希望我提供的最小代码适合于此目的。请让我知道我可能错过或做错了什么。
提前感谢大家!