3 回答
TA贡献2012条经验 获得超12个赞
class A{
public:
friend void fun(A a){std::cout << "Im here" << std::endl;}
friend void fun2(){ std::cout << "Im here2" << std::endl; }
friend void fun3();
};
虽然你的定义fun2 确实定义了一个“全球性”的功能,而不是一个成员,并使它成为friend的A同时,仍然丢失了一些在全球范围内本身相同功能的声明。
这意味着该范围内的任何代码都不fun2存在任何想法。
发生相同的问题fun,因为依赖于参数的查找可以接管并找到该函数,因为存在类型为的参数A。
我建议改为以通常的方式定义函数:
class A {
friend void fun(A a);
friend void fun2();
friend void fun3();
};
void fun(A a) { std::cout << "I'm here" << std::endl; }
void fun2() { std::cout << "I'm here2" << std::endl; }
void fun3();
现在注意,一切正常(除了fun3因为我从未定义过)。
TA贡献1806条经验 获得超8个赞
您可以调用的原因fun是,类内的friend声明A仅通过依赖于参数的查找使其可见。否则,朋友声明不会使它们声明的函数在出现的类范围之外自动可见。
您需要在名称空间范围内或内部添加声明,main以使其fun2在中可见main。
例如
void fun2();
fun3在内部可见,main因为其定义(在类外部)也是一个声明,使它可以从看到main。
ISO / IEC 14882:2011 7.3.1.2:
直到通过在名称空间范围中提供匹配的声明(在授予友谊的类定义之前或之后),才可以通过非限定查找(3.4.1)或限定查找(3.4.3)找不到朋友的名称。
3.4.2(依赖于参数的名称查找)/ 4:
在关联类中声明的任何命名空间范围的好友函数或好友函数模板在其各自的命名空间中都是可见的,即使它们在普通查找(11.3)中不可见。
- 3 回答
- 0 关注
- 294 浏览
添加回答
举报