c++ - 利点 - 演算子オーバーロード java




どのようにostreamのための<<演算子を適切にオーバーロードするのですか? (4)

私は行列演算のために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);
    }
}

そして、 "実装":

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&)'は、

私はこのエラーでちょっと混乱していますが、もう一度C ++は6ヶ月のJavaをたくさんやってから少し錆びました。 :-)


C ++ 14では、次のテンプレートを使用して、T :: print(std :: ostream&)constを持つオブジェクトをすべて印刷できます。 メンバー。

template<class T>
auto operator<<(std::ostream& os, const T& t) -> decltype(t.print(os), os) 
{ 
    t.print(os); 
    return os; 
} 

Mehrdadの答えに追加するには、

namespace Math
{
    class Matrix
    {
       public:

       [...]


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

あなたの実装では

std::ostream& operator<<(std::ostream& stream, 
                     const Math::Matrix& matrix) {
    matrix.print(stream); //assuming you define print for matrix 
    return stream;
 }

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


他の可能性について教えてください:私は友人の定義を使うのが好きです:

namespace Math
{
    class Matrix
    {
    public:

        [...]

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

この関数は自動的に周囲のネームスペースMath (その定義はそのクラスのスコープ内に表示されますが)にターゲットされますが、operator依存関係を検索するMatrixオブジェクトをoperator <<を呼び出さないと表示されません。 これはMatrix以外の引数型では見えないので、あいまいな呼び出しを助けることがあります。 その定義を書くときには、MatrixとMatrix自体で定義された名前を直接参照することもできます。 Math::Matrix<TypeA, N>接頭辞を長くしたり、 Math::Matrix<TypeA, N>ようなテンプレートパラメータを指定する必要はありません。





ostream