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>
ようなテンプレートパラメータを指定する必要はありません。