9

我创建了一个Matrix基本上代表数学矩阵的类。为了使用标量矩阵乘法,我将*运算符重载为:

Matrix Matrix::operator*(double scalar) const
{
    Matrix result(*this);
    result *= scalar;
    return result;
}

为了使操作员也从左侧工作,我使用了:

Matrix operator*(double a, const Matrix &M)
{
  return M * a;
}

给定Matrix Mand double sM * s工作正常,但s * M给我一个错误:

错误 C2677:二进制*:未找到采用类型的全局运算符Matrix(或没有可接受的转换)

而 IDE 向我显示错误:“没有运算符*与这些操作数匹配”

知道可能是什么问题吗?


编辑:这是一个愚蠢的错误!我没有在标题中声明运算符,编译器看不到声明!很抱歉那...

4

1 回答 1

8

当我遵循关于运算符重载的常见问题解答条目中给出的建议时(尤其是关于二进制算术运算符的段落),我无法重现您的错误。

这对我来说编译得很好:

struct M {
    M& operator*= (float f) {
        // multiply this by f
        return *this;
    }
};

inline M operator* (M m, float f) {
    m *= f;
    return m;
}

inline M operator* (float f, M m) {
    return m * f;
}

int main() {
    M m;
    float f;
    m * f;
    f * m;
}

我希望这有帮助。如果没有,请提供更多代码。

于 2013-06-19T18:38:43.733 回答