我正在尝试制作一个矩阵类,我需要能够将矩阵乘以一个数字
template<typename type = double>
class Test {
type i;
public:
Test(type _i) {
i = _i;
}
Test<type> operator * (type val) const {
Test<type> t(val * i);
return t;
}
};
int main() {
Test<> test(1);
Test<> test2 = 3.0 * test;
system("pause");
return 0;
}
您已使用成员函数重载了乘法运算符,该成员函数仅在以下情况下使用
也就是说,您的运算符恰好是将矩阵乘以数字的运算符,而不是将数字乘以矩阵的运算符。在您的表达式版本中,您的运算符不适用。
为第一个操作数的类型编写另一个运算符
double。这样的运算符不能由成员函数实现,而只能由独立函数实现。(这种运算符重载的变体通常称为“友元重载”,尽管友元在这里没有直接作用。)
为了对称性,将两个版本的运算符实际实现为单独的函数是值得的。通常,值得养成的习惯是始终首先考虑使用独立函数重载算术运算符的选项,并且仅在不可能/不适合使用成员函数重载的情况下。
此外,您的代码目前能够将类型标量隐式转换为
type类型矩阵Test<type>。这可能会导致意外。如果您不想将隐式标量转换为矩阵,请将转换构造函数声明为explicit.