Bruce eckel による Thinking in C++ には、次のようにフレンド関数に関する例が示されています。
// Declaration (incomplete type specification):
struct X;
struct Y {
void f(X*);
};
struct X { // Definition
private:
int i;
public:
friend void Y::f(X*); // Struct member friend
};
void Y::f(X* x) {
x->i = 47;
}
今、彼はこれを説明しました:
Y::f(X*) は X オブジェクトのアドレスを取ることに注意してください。型のサイズに関する完全な情報がなくても、渡されるオブジェクトに関係なく固定サイズのアドレスを渡す方法をコンパイラが常に認識しているため、これは重要です。ただし、オブジェクト全体を渡そうとする場合、コンパイラは、Y::g(X) などの関数を宣言できるようにする前に、X の構造定義全体を確認して、サイズとその渡し方を知る必要があります。
しかし、私が試したとき
void f(X);
構造体 Y の宣言のように、エラーは表示されません。理由を説明してください。