在 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 对象的地址。这一点很关键,因为编译器总是知道如何传递一个地址,不管传递的对象是什么,这个地址都是固定大小的,即使它没有关于类型大小的完整信息。但是,如果您尝试传递整个对象,编译器必须先查看 X 的整个结构定义,以了解大小以及如何传递它,然后才能允许您声明诸如 Y::g(X) 之类的函数。
但是当我尝试
void f(X);
作为 struct Y 中的声明,它没有显示错误。请解释为什么?