class A {
friend void f() {}
};
// void f() {} // compile error: redifinition of 'void f()'
int main() {
f(); // compile error: 'f' is not declared in this scope
}
您在上面的示例中可以看到,如果f
在A
的封闭命名空间范围中调用,则编译器无法找到f
,这使我想到f
不在此范围中。但是,当添加具有相同签名功能的函数的定义时,编译器会发出功能重新定义的错误,这给了我相反的想法,即f
实际上在此范围内。
所以,我很困惑哪个范围属于上课定义的朋友功能属于。
它在包含类的名称空间中。
但是,如果仅在班级中声明,则仅通过参数依赖性查找才能获得。因此,这将起作用,参数类型A
在周围名称空间中查找f
:
class A {
friend void f(A) {}
};
int main() {
f(A()); // OK: uses ADL
::f(A()); // Error: doesn't use ADL, and can't find the name without it
}
这通常用于超载运算符,无论如何只能由ADL找到。
,如果您声明而不是重新定义,则您的版本将有效。
在名称空间范围内void f();
只能在类中声明而不是定义的朋友函数。例如。朋友void f();