2012-08-08 106 views
4

所以,我有我创建了具有以下运算符重载的通用矩阵类:C++运算符重载和继承

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

我也有,从我的矩阵类继承的矩阵2类。

class Matrix2 : public Matrix 
{ 
}; 

当我尝试乘两个矩阵2的对象在一起,我得到一个编译器错误,指出:

“没有运营商发现,这需要类型矩阵2的左手操作数(或没有访问的变换) '

这是为什么,我该如何正确实现带继承的操作符重载?

编辑:

正如指出我的问题是部分原因是因为“最棘手的解析”的。现在我的问题,我相信,严格地与操作符重载和继承有关。

我可以将两个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

这只是一个猜测,但是您可以尝试在超载声明之前添加一个“public”修饰符 – 2012-08-08 20:36:26

+0

运算符重载位于Matrix类的公共部分。 – Bob 2012-08-08 20:38:20

+3

在所有情况下,一个完整的最小可编译示例,使其他人能够遇到同样的错误,你做的是有用的。 – PlasmaHH 2012-08-08 20:38:51

回答

3

你咬的最棘手的解析。这是导致声明函数而不是对象的语法错误。

+0

哦!我明白你的意思了。但是,我有2个构造函数:一个不需要参数,一个需要几个参数。当我声明2个对象(一个使用无参数构造函数,另一个使用带多个参数的构造函数),并尝试将它们相乘时,编译器仍然抱怨。 – Bob 2012-08-08 21:04:37

+0

我已经更新了上面的问题。 – Bob 2012-08-08 21:05:05

2

的问题是不是与重载运算符,它与你定义,你可能会想,m1m2Matrix类型,但他们实际上都是函数返回Matrix(不带参数)的变量。尝试删除声明中的圆括号,看看事情是否更好。

这是@DeadMG在他的回答中提到的Most Vexing Parse

2

检查出关于运算符重载的this article,它解释得很好。

正如@silvesthu解释的那样,将乘法运算符作为一个带2个参数的静态函数并返回一个新的对象可能会更好。如果您需要以某种方式修改您的班级,例如使用*=运算符,则可以使用静态函数来实现此功能。

更新

编译下面的代码对我的作品;

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对象确实可以相乘。我不确定你为什么会遇到任何问题。