C++ 使用了错误的操作员过载

C++ 使用了错误的操作员过载,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我对模板化操作符重载有点困惑。 喂,我有课 template <typename T1> base_matrix{ ... }; 这应该在我乘以两个矩阵时使用,例如A*B 版本#2 模板 友基矩阵算子*(常数基矩阵&ob,t2f){ 基矩阵res(ob);res*=(T1)f;返回res; } 模板 友基矩阵算子*(t2f,常数基矩阵&ob){ 基矩阵res(ob);res*=(T1)f;返回res; } 当我将一个矩阵对象和一个数字(T2=int,double,comple

我对模板化操作符重载有点困惑。 喂,我有课

template <typename T1> base_matrix{
 ... 
};
这应该在我乘以两个矩阵时使用,例如A*B

版本#2

模板
友基矩阵算子*(常数基矩阵&ob,t2f){
基矩阵res(ob);res*=(T1)f;返回res;
}
模板
友基矩阵算子*(t2f,常数基矩阵&ob){
基矩阵res(ob);res*=(T1)f;返回res;
}
当我将一个矩阵对象和一个数字(T2=int,double,complex,等等)相乘时,应该使用它,例如,a*2,3.0*a

现在,当我尝试将两个矩阵相乘时,会调用第二个重载版本,这有点道理,因为T2可以是任何数据类型,包括
base\u matrix
,但这不是我想要的(版本1)。当然,这会导致错误,因为编译器会尝试将此类型的参数转换为T1(双精度)

出于某种原因,操作符重载的第一个版本没有被调用,我不明白为什么

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


提前谢谢大家

Missing
const
@Yakk,你能详细说明一下你的答案吗?不确定const应该去哪里(这些友元函数不能是const,进行T2 const或const引用不会改变情况),这不是答案。只是一个评论;第一个参数
ob
上缺少常量。
base_matrix<T1> operator*(base_matrix<T1>& ob) const{
...
}
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;
}