C++运算符重载和继承

4

我有一个通用的矩阵类,其中包含以下运算符重载:

class Matrix
{
public:
    Matrix() {}
    Matrix(int i, int j, int k) {}
    Matrix operator*(const Matrix &right)
    {
    }
};

我还有一个矩阵2类,它继承自我的矩阵类。
class Matrix2 : public Matrix
{
};

当我尝试将两个Matrix2对象相乘时,我收到一个编译器错误,指出:“没有找到接受类型为Matrix2的左操作数的运算符(或者没有可访问的转换)”。这是为什么?如何正确地实现继承中的运算符重载?
编辑:正如所指出的那样,我的问题部分原因是“最烦人的解析”。现在,我相信我的问题严格涉及运算符重载和继承。我可以很好地将两个Matrix对象相乘,但我不能将两个Matrix2对象相乘。
Matrix2 i;
Matrix2 m;
Matrix result = m * i;

错误消息:

错误 C2678:二进制“*”:没有找到接受左操作数类型为“Matrix2”的运算符(或不存在可接受的转换)。


运算符重载位于我的矩阵类的公共部分。 - Bob
3
在所有情况下,提供一个完整的最小可编译示例,使他人能够重现您遇到的相同错误是有用的。 - PlasmaHH
在 @Motti 的回答基础上,尝试将声明更改为 Matrix Matrix::operator*(const Matrix &right){},以便使此运算符重载正常工作。 - Steztric
@Steztric 更改声明会导致更多错误。那到底是什么原因呢? - Bob
@Chris我使用IdeOne.com编译了提供的代码,看起来一切正常。operator*的实现是什么?哪一行出错了? - Kaiged
显示剩余5条评论
3个回答

3

您遇到了最让人头疼的解析问题,它是一种语法错误,会导致声明函数而不是对象。


哦!我明白你的意思了。然而,我有两个构造函数:一个不带参数,另一个带有多个参数。当我声明两个对象(一个使用无参构造函数,另一个使用带有多个参数的构造函数)并尝试将它们相乘时,编译器仍然会报错。 - Bob

2
请查看有关运算符重载的这篇文章,它解释得非常好。
正如@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对象确实可以相乘。我不确定你为什么会遇到任何问题。


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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接