4

所以我有一个我创建的通用 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).

4

3 回答 3

3

你正在咬最令人烦恼的 Parse。这是导致声明函数而不是对象的语法错误。

于 2012-08-08T20:50:40.510 回答
2

问题不在于重载的运算符,而在于您定义的变量,您可能认为m1andm2是类型Matrix,但它们实际上是返回的函数Matrix(没有参数)。尝试删除声明中的括号,看看情况是否更好。

这是@DeadMG 在他的回答中提到的最令人烦恼的解析。

于 2012-08-08T20:53:19.213 回答
2

查看这篇关于运算符重载的文章,它很好地解释了事情。

正如@silvesthu 解释的那样,将乘法运算符实现为一个静态函数可能会更好,它接受两个参数并返回一个新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 对象确实可以相乘。我不确定你为什么会遇到任何问题。

于 2012-08-08T20:56:36.920 回答