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 Mdouble s、正常にM * s動作しますがs * M、エラーが発生します。

エラー C2677: バイナリ*: 型を取るグローバル演算子が見つかりませんMatrix(または、受け入れ可能な変換がありません)

IDE にはエラーが表示されますが、「これらのオペランドに一致する演算子はありません*というエラーが表示されます。

何が問題なのですか?


編集:それはばかげた間違いでした!ヘッダーで演算子を宣言していなかったので、コンパイラは宣言を認識できませんでした! 申し訳ありません...

4

1 に答える 1

8

演算子のオーバーロードに関する FAQ エントリ(特に二項算術演算子の段落) に記載されている推奨事項に従うと、エラーを再現できません。

これは私にとってはうまくコンパイルされます:

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 に答える