【问题标题】:C++ Operator Overload and InheritanceC++ 运算符重载和继承
【发布时间】:2012-08-08 20:34:22
【问题描述】:

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

【问题讨论】:

  • 这只是一个猜测,但您可以尝试在重载声明之前添加public 修饰符
  • 运算符重载在我的 Matrix 类的公共部分。
  • 在所有情况下,一个完整的最小可编译示例可以让其他人遇到与您相同的错误。
  • 所以这不是继承问题...只是尝试将两个 Matrix 对象相乘,编译器仍然报错。
  • 除了@Motti 的回答,尝试将声明更改为Matrix Matrix::operator*(const Matrix &right){} 以使此运算符重载正常工作。

标签: c++ visual-c++ inheritance operator-overloading


【解决方案1】:

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

【讨论】:

  • 哦!我明白你的意思了。但是,我有 2 个构造函数:一个不带参数,一个带多个参数。当我声明 2 个对象(一个使用无参数构造函数,一个使用带有多个参数的构造函数)并尝试将它们相乘时,编译器仍然会报错。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    查看this article 关于运算符重载,它很好地解释了事情。

    正如@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-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多