operator<<
をクラスの友達として宣言しますが、使用できるようにするファイルでとして定義します。static
これには1つの小さな欠点があります。定義したファイルの外部で使用しようとすると、実際に必要なコンパイラエラーではなく、リンカエラーが発生するだけです。一方で、それでも保護がまったくないよりもはるかに優れています。
これが簡単なデモです。まず、クラス定義を含むヘッダーとjunk
、演算子へのアクセスをテストするために使用する関数を宣言します。
// trash.h
#include <iostream>
class X {
friend std::ostream &operator<<(std::ostream &, X const &);
};
void junk(X const &);
次に、定義するファイルX
と演算子。ここから演算子にアクセスできるはずです。
#include "trash.h"
static std::ostream &operator<<(std::ostream &os, X const &x) {
return os << "x";
}
int main() {
X x;
std::cout << x;
junk(x);
return 0;
}
次に、オペレーターにアクセスできない2番目のファイル:
#include "trash.h"
void junk(X const &x) {
// un-comment the following, and the file won't link:
//std::cout << x;
}
この場合、ファイルレベルのstatic
関数の代わりに匿名の名前空間を使用できないことに注意してください。試してみると、operator<<
許可したい場合でも、のあいまいなオーバーロードとして表示されます。