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
实际上在此范围内的相反想法。
所以,我很困惑一个类内定义的朋友函数属于哪个范围。
答案 0 :(得分:6)
它位于包含类的命名空间中。
但是,如果它只在类中声明,那么它只能通过参数依赖查找来实现。所以这可行,参数类型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();
答案 1 :(得分:-3)
友元函数只应在类中声明,而不是定义。例如。朋友void f();