1. ホーム
  2. c++

[解決済み】 ostreamの<<演算子を適切にオーバーロードする方法は?

2022-04-04 20:59:41

質問

私はC++で行列演算のための小さな行列ライブラリを書いています。しかし、以前は文句を言われなかったのに、コンパイラが文句を言うようになりました。このコードは6ヶ月間棚に放置され、その間に私のコンピュータを debian etch から lenny (g++ (Debian 4.3.2-1.1) 4.3.2) にアップグレードしました。 ) にアップグレードしましたが、同じ g++ を使った Ubuntu システムでも同じ問題があります。

以下は、私のマトリックスクラスの該当部分です。

namespace Math
{
    class Matrix
    {
    public:

        [...]

        friend std::ostream& operator<< (std::ostream& stream, const Matrix& matrix);
    }
}

そして、"implementation"。

using namespace Math;

std::ostream& Matrix::operator <<(std::ostream& stream, const Matrix& matrix) {

    [...]

}

これは、コンパイラが出したエラーです。

matrix.cpp:459: error: 'std::ostream& Math::Matrix::operator<<(std::ostream&, const Math::Matrix&)' は、次のように受け取らなければなりません。 引数は1つ

このエラーにはちょっと戸惑いましたが、この半年間Javaをたくさんやっていたので、私のC++はちょっと錆びついてしまいました :-)。

解決方法は?

関数を friend . これはクラスのメンバではありません。を削除する必要があります。 Matrix:: を実装から削除してください。 friend は、指定された関数(クラスのメンバではない)がプライベートメンバ変数にアクセスできることを意味します。この関数の実装方法は、インスタンスメソッドのように Matrix というクラスがありますが、これは間違いです。