所以我创建了一个通用的Matrix类,它具有以下运算符重载:
class Matrix
{
public:
Matrix() {}
Matrix(int i, int j, int k) {}
Matrix operator*(const Matrix &right)
{
}
};
我还有一个继承自我的Matrix类的Matrix2类。
class Matrix2 : public Matrix
{
};
当我尝试将两个Matrix2对象相乘时,我得到一个编译器错误说明:
'没有找到哪个运算符采用了Matrix2类型的左手操作数(或者没有可访问的转换)'
为什么这样做以及如何通过继承正确实现运算符重载?
修改
正如我所指出的,我的问题部分是因为“最令人烦恼的解析”。现在我的问题,我认为,严格地与运算符重载和继承有关。
我可以很好地将两个Matrix对象相乘,但我不能将两个Matrix2对象相乘。
Matrix2 i;
Matrix2 m;
Matrix result = m * i;
错误消息:
error C2678: binary '*' : no operator found which takes a left-hand operand of type 'Matrix2' (or there is no acceptable conversion).
答案 0 :(得分:3)
你正在咬最疯狂的解析。这是一个语法错误导致函数声明而不是对象。
答案 1 :(得分:2)
问题不在于重载运算符,而在于您定义的变量,您可能认为m1
和m2
属于Matrix
类型,但实际上它们是什么函数返回Matrix
(没有参数)。尝试删除声明中的括号,看看事情是否更好。
这是@DeadMG在答案中提到的Most Vexing Parse。
答案 2 :(得分:2)
查看有关运算符重载的this article,它解释得非常好。
正如@silvesthu所解释的那样,将乘法运算符作为一个静态函数实现2个参数并返回一个新的Matrix
对象可能会更好。如果您需要以某种方式修改类,例如使用*=
运算符,则可以根据静态函数实现此类。
<强>更新强>
编译以下代码对我有用;
class Matrix
{
public:
Matrix() {}
Matrix(int i, int j, int k) {}
Matrix operator*(const Matrix &right)
{
return Matrix();
}
};
class Matrix2 : public Matrix
{
};
int _tmain(int argc, _TCHAR* argv[])
{
Matrix2 a, b;
Matrix c = a * b;
return 0;
}
显示两个Matrix2对象确实可以相乘。我不确定你为什么会遇到任何问题。