哪个范围属于课堂定义的朋友函数
Which scope does an in-class-defined friend function belong to?
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();
相关文章:
- 限制多模板参数朋友函数可访问的类实例的范围
- 朋友函数随机行为
- 使用朋友函数时,会保护变量
- 如何在CPP文件中使用朋友函数
- 我们如何将Ostream函数作为类的成员函数实现,而不是作为朋友函数,以便我可以用作虚拟函数
- 在模板类中编写朋友函数声明的正确方法是什么?
- 如何将指针用于朋友函数作为成员函数的参数
- 为什么我们在这里创建朋友函数.C
- 运算符[]使用朋友函数超载
- 我们无法在本地类中定义朋友函数的原因是什么?
- 为什么在类定义中定义朋友函数
- 从朋友函数返回本地变量的引用
- 为什么我需要将此朋友函数的定义包装在名称空间中
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员<<这是一个iStream运算符
- 合格的朋友函数模板实例化
- 如何在两个类之外的模板类内部的非模板类中声明的朋友函数定义
- 哪个范围属于课堂定义的朋友函数
- 类模板中定义的朋友函数范围定义的范围是什么?
- 在朋友函数中遇到STL的麻烦
- 如何使朋友函数具有内部链接