使用了错误的操作员过载

时间:2017-04-23 21:27:58

标签: c++ templates operator-overloading

我对模板化的运算符重载感到有些困惑。 说,我有一个班级

template <typename T1> base_matrix{
 ... 
};

稍后,T1将是doublecomplex<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)。

由于某种原因,没有调用操作符重载的第一个版本,我很困惑为什么。

我正在寻求概念性的理解,所以希望我提供的最小代码适合于此目的。请让我知道我可能错过或做错了什么。

提前感谢大家!

0 个答案:

没有答案