为了账号安全,请及时绑定邮箱和手机立即绑定

访问类中定义的好友功能

访问类中定义的好友功能

C++
开满天机 2019-12-16 16:12:09
有这样的代码:#include <iostream>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();};void fun3(){    std::cout << "Im here3" << std::endl;}int main() {      fun(A()); // works ok    //fun2(); error: 'fun2' was not declared in this scope    //A::fun2(); error: 'fun2' is not a member of 'A'    fun3(); // works ok} 如何访问函数fun2()?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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因为我从未定义过)。



查看完整回答
反对 回复 2019-12-17
?
白衣非少年

TA贡献1155条经验 获得超0个赞

您可以调用的原因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)中不可见。



查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 398 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信